From e83a1e01ca5152b702c2587b728989cd95fa5946 Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Fri, 20 Dec 2024 17:48:47 +0800
Subject: [PATCH 01/16] 1
---
sdk/src/AppScreenPrint.js | 1752 +++++++++++++++++++++----------------
1 file changed, 990 insertions(+), 762 deletions(-)
diff --git a/sdk/src/AppScreenPrint.js b/sdk/src/AppScreenPrint.js
index 88406ee..ca85672 100644
--- a/sdk/src/AppScreenPrint.js
+++ b/sdk/src/AppScreenPrint.js
@@ -12,330 +12,446 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+import JMuxer from 'jmuxer';
import work from 'webworkify-webpack';
import AESGCMCrypto from './AESGCMCrypto';
+import AudioPlayer from './AudioPlayer';
+import AutoRotation from './AutoRotation';
+import CanvasPlayer from './CanvasPlayer';
import Subscribe from './common/Subscribe';
+import CANVAS_WHITE_LIST from './config/canvasWhiteList';
import PROTOCOL_CONFIG from './config/protocolConfig';
import delayAnalysis from './DelayAnalysis';
import FrameParser from './FrameParser';
-import logger from './Logger';
+import Logger from './Logger';
+import TouchHandler from './TouchHandler';
import Util from './Util';
import SocketWorker from './worker/SocketWorker';
+import KeyboardInput from "./KeyboardInput";
+import DirectionHandler from './DirectionHandler';
+import DeviceHardwareHandler from './DeviceHardwareHandler';
import {
- PACKAGE_HEADER_LENGTH,
- MEDIA_MSG_HEADER_COUNT,
- DEFAULT_DEFINITION,
- FRAME_TYPE_MAP,
+ PACKAGE_HEADER_LENGTH,
+ MEDIA_MSG_HEADER_COUNT,
+ DEFAULT_DEFINITION,
+ FRAME_TYPE_MAP
} from './config/commonConfig';
+import FullScreen from './Fullscreen';
+import KeyboardListener from './KeyboardListener';
+
/*global __IS_DEBUG__*/
if (__IS_DEBUG__) {
- window.delayAnalysis = delayAnalysis;
+ window.delayAnalysis = delayAnalysis;
}
-const CAE_STREAM_DELIMITER_MAGICWORD = 0x5a5a;
+
+const CAE_STREAM_DELIMITER_MAGICWORD = 0x5A5A;
const K_UNIT = 1000;
const K_BIT_UNIT = 8000;
const DEFAULT_ORIENTATION = 'PORTRAIT';
const APP_STATE_FROM_CLIENT = {
- connecting: {
- state: 256,
- message: 'Connecting',
- },
- connected: {
- state: 512,
- message: 'Connect success',
- },
- unreachable: {
- state: 769,
- message: 'Server unreachable',
- tip: '连接服务器失败,请稍后重试',
- },
- reconnecting: {
- state: 2816,
- message: 'Reconnecting',
- },
- exit: {
- state: 5888,
- message: 'Cloud Phone exit',
- tip: '已退出',
- },
+ 'connecting': {
+ state: 256,
+ message: 'Connecting'
+ },
+ 'connected': {
+ state: 512,
+ message: 'Connect success'
+ },
+ 'unreachable': {
+ state: 769,
+ message: 'Server unreachable',
+ tip: '连接服务器失败,请稍后重试'
+ },
+ 'reconnecting': {
+ state: 2816,
+ message: 'Reconnecting'
+ },
+ 'exit': {
+ state: 5888,
+ message: 'Cloud Phone exit',
+ tip: '已退出'
+ }
};
const APP_STATE_ERROR_CODE_TIP = {
- 5888: '已退出',
- 769: '连接服务器失败,请稍后重试',
- 2308: '启动失败',
- 4353: '启动失败',
- 770: '资源正在使用中,请稍后',
- 65535: '与服务器连接出现异常',
- 1537: '认证失败',
- 1538: '认证失败',
- 1539: '认证失败',
- 1540: '认证失败',
- 1541: '认证失败',
- 1542: '认证失败',
- 1543: '登录信息失效,请重新登录',
- 3584: '试玩时间已到',
- 2560: '与服务器连接出现异常',
- 3840: '由于您长时间未操作,服务断开',
- 4096: '切换后台超时',
- 8960: '云机在其他设备上被连接,本次连接退出',
+ 5888: '已退出',
+ 769: '连接服务器失败,请稍后重试',
+ 2308: '启动失败',
+ 4353: '启动失败',
+ 770: '资源正在使用中,请稍后',
+ 65535: '与服务器连接出现异常',
+ 1537: '认证失败',
+ 1538: '认证失败',
+ 1539: '认证失败',
+ 1540: '认证失败',
+ 1541: '认证失败',
+ 1542: '认证失败',
+ 1543: '登录信息失效,请重新登录',
+ 3584: '试玩时间已到',
+ 2560: '与服务器连接出现异常',
+ 3840: '由于您长时间未操作,服务断开',
+ 4096: '切换后台超时',
+ 8960: '云机在其他设备上被连接,本次连接退出'
};
const DEFAULT_VALUME_VALUE = 50;
const WEBSOCKET_READY_STATE = {
- CONNECTING: 0,
- OPEN: 1,
- CLOSING: 2,
- CLOSED: 3,
+ CONNECTING: 0,
+ OPEN: 1,
+ CLOSING: 2,
+ CLOSED: 3
};
const WORKER_STATE = {
- CHECKING: 0,
- LIVE: 1,
+ CHECKING: 0,
+ LIVE: 1
};
class AppController {
- constructor(options) {
- this.firstIFrame = true;
- this.options = { volume: DEFAULT_VALUME_VALUE, ...options };
- this.util = new Util();
- this.currentVisible = 'visibility';
- this.subscribe = new Subscribe([
- 'appStateChange',
- 'cloudAppData',
- 'phoneViewChange',
- ]);
- // WebSocket variable
- this.useSocketWorker = AppController.isSupportURL();
- this.wsState = undefined;
- this.sessionId = this.options.sessionId || this.generateGUID();
- this.reconnection = {
- can: true,
- maxTimes: this.options.reconnectTimes,
- count: 0,
- timerDelay: 1000,
- timerHander: null,
- reconnecting: false, // 用于标识已进入重连流程,避免page visibility、page show处理时判断是否要主动触发重连
- trigger: '', // 标识什么事件触发了重连,visibilityChange/pageshow/socketCloseEvent
- };
- // 网络时延/码率
- this.networkInfo = {
- heartBeatSendTimes: [],
- sendTimesMaxCount: 4,
- delay: 0,
- bitRate: 0,
- kbitCount: 0,
- lastRefreshTime: 0,
- };
- this.lastReceivingTime = null;
-
- this.frameParser = new FrameParser(this.options.supportAudio);
- this.curResolution = { ...PROTOCOL_CONFIG.DEFAULT_RESOLUTION };
- this.createSocket();
- this.socketWorkerState = {
- worker: null,
- socket: null,
- };
- this.appState = null;
- this.socketHasOpenned = false; // 标识socket是否已open过,用于重连时判断发送connect还是reconnect cmd
- }
+ constructor(options) {
+ this.firstIFrame = true;
+ this.options = {volume: DEFAULT_VALUME_VALUE, ...options};
+ this.util = new Util();
+ this.render = true;
+ this.player = null;
+ this.currentVisible = 'visibility';
+ this.playerContainerId = undefined;
+ this.subscribe = new Subscribe([
+ 'phoneViewChange',
+ 'appStateChange',
+ 'cloudAppData',
+ ]);
+ this.cameraMsgHeader = null;
+ this.microPhoneMsgHeader = null;
+ this.cameraMsgBody = null;
+ this.microPhoneMsgBody = null;
+ this.sensorMsgHeader = null;
+ this.gpsLocationMsgHeader = null;
+ this.cameraMsgType = PROTOCOL_CONFIG.CAMERA_MESSAGE_TYPE;
+ this.microPhoneMsgType = PROTOCOL_CONFIG.MICROPHONE_MESSAGE_TYPE;
+ this.sensorMsgType = PROTOCOL_CONFIG.SENSOR_MESSAGE_TYPE;
+ this.keyEventCodeType = PROTOCOL_CONFIG.KEYEVENT_KEYCODE_TYPE;
+ this.gpsLocationMsgType = PROTOCOL_CONFIG.GPS_LOCATION_MESSAGE_TYPE;
+ // WebSocket variable
+ this.useSocketWorker = AppController.isSupportURL();
+ this.wsState = undefined;
+ this.sessionId = this.options.sessionId || this.generateGUID();
+ this.reconnection = {
+ can: true,
+ maxTimes: this.options.reconnectTimes,
+ count: 0,
+ timerDelay: 1000,
+ timerHander: null,
+ reconnecting: false, // 用于标识已进入重连流程,避免page visibility、page show处理时判断是否要主动触发重连
+ trigger: '' // 标识什么事件触发了重连,visibilityChange/pageshow/socketCloseEvent
+ };
+ // 网络时延/码率
+ this.networkInfo = {
+ heartBeatSendTimes: [],
+ sendTimesMaxCount: 4,
+ delay: 0,
+ bitRate: 0,
+ kbitCount: 0,
+ lastRefreshTime: 0
+ };
+ this.lastReceivingTime = null;
+ this.heartBeatInterval = 1000;
+ this.linkOverTime = 4000;
+
+ this.frameParser = new FrameParser(this.options.supportAudio);
+ this.autoRotation = null;
+ this.curResolution = {...PROTOCOL_CONFIG.DEFAULT_RESOLUTION};
+ this.nextResolution = {...PROTOCOL_CONFIG.DEFAULT_RESOLUTION};
- createSocket() {
- if (this.useSocketWorker) {
- this.__createSocketWorker();
- } else {
- this.__createSocketWithoutWorker();
+ this.createSocket();
+ this.socketWorkerState = {
+ worker: null,
+ socket: null
+ };
+ this.appState = null;
+ this.socketHasOpenned = false; // 标识socket是否已open过,用于重连时判断发送connect还是reconnect cmd
+
+ // 初始化全屏类
+ this.fullscreen = new FullScreen({
+ containerId: this.options.containerId,
+ autoRotate: this.options.autoRotate,
+ isMobile: this.options.isMobile
+ });
+ this.fullscreen.init();
}
- }
-
- __createSocketWorker() {
- /* javascript-obfuscator:disable */
- this.socketWorker = work(require.resolve('./worker/SocketWorker.js'));
-
- /* javascript-obfuscator:enable */
- this.socketWorker.addEventListener('message', evt => {
- const objData = evt.data;
- switch (objData.cmd) {
- case 'openRsp':
- this.onOpenSocket(objData.state);
- break;
- case 'errorRsp':
- this.onError();
- break;
- case 'recvRsp':
- this.onMessage(objData.buf, objData.time);
- break;
- case 'heartbeatRsp':
- this.recordHeartbeat(objData.time);
- break;
- case 'closeRsp':
- if (
- (this.reconnection.reconnecting &&
- this.reconnection.trigger === 'socketCloseEvent') ||
- !this.reconnection.reconnecting
- ) {
- this.onClose(objData.state, 'socketCloseEvent');
- }
-
- break;
- case 'socketStateRsp':
- this.updateSocketWorkerState(WORKER_STATE.LIVE, objData.state);
- break;
- default:
- logger.debug('Unknown command from socket worker.');
- }
- });
- this.socketWorker.addEventListener('error', () => {
- logger.debug('Socket worker error.');
- });
- this.initSocket = connectURI => {
- this.socketWorker.postMessage({
- cmd: 'initReq',
- options: {
- protocol: _HTTP_MODE_ ? 'ws' : 'wss',
- connectURI,
- needHeatBeat: this.options.needHeatBeat,
- },
- });
- };
-
- this.send = data => {
- this.socketWorker.postMessage({ cmd: 'sendReq', data: data });
- };
- this.startHeartbeat = () => {
- this.socketWorker.postMessage({ cmd: 'startHeartbeatReq' });
- };
-
- this.stopHeartbeat = () => {
- this.socketWorker.postMessage({ cmd: 'stopHeartbeatReq' });
- };
+ createSocket() {
+ if (this.useSocketWorker) {
+ this.__createSocketWorker();
+ } else {
+ this.__createSocketWithoutWorker();
+ }
+ }
- this.closeSocket = () => {
- this.socketWorker.postMessage({ cmd: 'closeReq' });
- };
+ __createSocketWorker() {
+
+ /* javascript-obfuscator:disable */
+ this.socketWorker = work(require.resolve('./worker/SocketWorker.js'));
+
+ /* javascript-obfuscator:enable */
+ this.socketWorker.addEventListener('message', evt => {
+ const objData = evt.data;
+ switch (objData.cmd) {
+ case 'openRsp':
+ this.onOpenSocket(objData.state);
+ break;
+ case 'errorRsp':
+ this.onError();
+ break;
+ case 'recvRsp':
+ this.onMessage(objData.buf, objData.time);
+ break;
+ case 'heartbeatRsp':
+ this.recordHeartbeat(objData.time);
+ break;
+ case 'closeRsp':
+ if ((this.reconnection.reconnecting && this.reconnection.trigger === 'socketCloseEvent') || !this.reconnection.reconnecting) {
+ this.onClose(objData.state, 'socketCloseEvent');
+ }
+
+ break;
+ case 'socketStateRsp':
+ this.updateSocketWorkerState(WORKER_STATE.LIVE, objData.state);
+ break;
+ default:
+ Logger.debug('Unknown command from socket worker.');
+ }
+ });
+ this.socketWorker.addEventListener('error', () => {
+ Logger.debug('Socket worker error.');
+ });
- this.checkSocketWorkerState = () => {
- this.updateSocketWorkerState(WORKER_STATE.CHECKING, null);
- this.socketWorker.postMessage({ cmd: 'socketStateReq' });
- };
- }
+ this.initSocket = connectURI => {
+ this.socketWorker.postMessage({
+ cmd: 'initReq',
+ options: {
+ protocol: _HTTP_MODE_ ? 'ws' : 'wss',
+ connectURI,
+ needHeatBeat: this.options.needHeatBeat
+ }
+ });
+ };
+
+ this.send = data => {
+ this.socketWorker.postMessage({cmd: 'sendReq', data: data});
+ };
+
+ this.startHeartbeat = () => {
+ this.socketWorker.postMessage({cmd: 'startHeartbeatReq'});
+ };
+
+ this.stopHeartbeat = () => {
+ this.socketWorker.postMessage({cmd: 'stopHeartbeatReq'});
+ };
+
+ this.closeSocket = () => {
+ this.socketWorker.postMessage({cmd: 'closeReq'});
+ };
+
+ this.checkSocketWorkerState = () => {
+ this.updateSocketWorkerState(WORKER_STATE.CHECKING, null);
+ this.socketWorker.postMessage({cmd: 'socketStateReq'});
+ };
+ }
- __createSocketWithoutWorker() {
- this.socket = new SocketWorker();
- this.initSocket = connectURI => {
- this.socket.init({
- protocol: _HTTP_MODE_ ? 'ws' : 'wss',
- connectURI,
- needHeatBeat: this.options.needHeatBeat,
- });
- };
+ __createSocketWithoutWorker () {
+ this.socket = new SocketWorker();
+ this.initSocket = connectURI => {
+ this.socket.init({
+ protocol: _HTTP_MODE_ ? 'ws' : 'wss',
+ connectURI,
+ needHeatBeat: this.options.needHeatBeat
+ });
+ };
+
+ // playEvent使用时,使用self
+ this.send = data => {
+ this.socket.send(data);
+ };
+
+ this.startHeartbeat = () => {
+ this.socket.startHeartbeat();
+ };
+
+ this.stopHeartbeat = () => {
+ this.socket.stopHeartbeat();
+ };
+
+ this.closeSocket = () => {
+ this.socket.destroy();
+ };
+
+ this.socket.onOpen = this.onOpenSocket.bind(this);
+ this.socket.onError = this.onError.bind(this);
+ this.socket.onMessage = data => {
+ this.onMessage(data, Date.now());
+ };
+
+ this.socket.onClose = this.onClose.bind(this);
+ this.socket.onHeartbeatSended = this.recordHeartbeat.bind(this);
+ }
- // playEvent使用时,使用self
- this.send = data => {
- this.socket.send(data);
- };
+ onOpenSocket(state) {
+ this.socketHasOpenned = true;
+ this.wsState = state;
+ // page visibility场景检查socket状态后延迟处理,此处刷新socket状态,避免在延迟时间里close触发重连后,page visibility再次重连。
+ this.updateSocketWorkerState(WORKER_STATE.LIVE, state);
+ this.reconnection.can = true;
+ this.reconnection.count = 0;
+ this.reconnection.reconnecting = false;
+
+ // 发送启动命令获取音视频数据
+ switch (this._action) {
+ case 'reconnect':
+ this._reconnect();
+ break;
+ default:
+ this.appState = APP_STATE_FROM_CLIENT.connected;
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ this.startCloudPhone();
+ this.listenPageVisibility();
+ this.listenPageShow();
+ }
+ }
- this.startHeartbeat = () => {
- this.socket.startHeartbeat();
- };
+ initPlyerAndStart() {
+ this.player = document.getElementById(this.options.containerId);
+ this.playerContainerId = document.getElementById(this.options.containerId);
+ if (this.player) {
+ this.touchHandler = new TouchHandler({
+ player: this.player,
+ isMobile: this.options.isMobile,
+ sendHandler: this.send,
+ isDebug: this.options.isDebug,
+ autoRotate: this.options.autoRotate,
+ inputId: this.keyboardInput && this.keyboardInput.inputId || '',
+ containerId: this.options.containerId,
+ });
+ this.touchHandler.start();
+
+ this.directionHandler = new DirectionHandler({
+ containerId: this.options.containerId,
+ isMobile: this.options.isMobile,
+ keepRatio: this.options.keepRatio,
+ playerContainerId: this.playerContainerId,
+ touchHandler: this.touchHandler
+ });
+ this.directionHandler.init();
+ this.listenPlayerSizeChange();
+
+ this.autoRotation = new AutoRotation(this.options.containerId,
+ DEFAULT_ORIENTATION, this.options.isMobile,rotateDegrees => {
+ // 旋转后更新触控,并根据旋转角度判断使用云机键盘还是真机键盘
+ this.touchHandler.resize();
+ });
+ this.autoRotation.init();
+
+ this.updateResolutionAndTouch();
+ }
+ }
- this.stopHeartbeat = () => {
- this.socket.stopHeartbeat();
- };
+ triggerSubscribe(event, data) {
+ this.subscribe.trigger(event.name, data);
+ }
- this.closeSocket = () => {
- this.socket.destroy();
- };
+ listenPlayerSizeChange() {
+ if (this.isMSE) {
+ // 视频元信息加载完成后,主动触发 resize 事件更新相关坐标位置
+ this.loadedmetadataCallback = () => {
+ this.touchHandler.resize();
+ // 使用完毕移除事件监听
+ this.player.removeEventListener('loadedmetadata', this.loadedmetadataCallback);
+ this.loadedmetadataCallback = null;
+ };
+
+ this.player.addEventListener('loadedmetadata', this.loadedmetadataCallback);
+
+ // video 大小变化时需要持续更新坐标位置
+ this.videoResizeCallback = () => {
+ this.touchHandler.resize();
+ };
+
+ this.player.addEventListener('resize', this.videoResizeCallback);
+ } else {
+ // 监听 canvas 大小变化
+ const MutationObserver = window.MutationObserver;
+ this.canvasObserver = new MutationObserver(mutations => {
+ mutations.forEach(mutation => {
+ if (mutation.attributeName === 'width' || mutation.attributeName === 'height') {
+ this.touchHandler.resize();
+ }
+ });
+ });
+ this.canvasObserver.observe(this.player, {attributes: true});
+ }
+ }
- this.socket.onOpen = this.onOpenSocket.bind(this);
- this.socket.onError = this.onError.bind(this);
- this.socket.onMessage = data => {
- this.onMessage(data, Date.now());
- };
+ onMessage(data, time) {
+ this.lastReceivingTime = time;
- this.socket.onClose = this.onClose.bind(this);
- this.socket.onHeartbeatSended = this.recordHeartbeat.bind(this);
- }
+ let videoNum = 0;
+ let beforeParseTime = 0;
+ /*global __IS_DEBUG__*/
+ if (__IS_DEBUG__) {
+ videoNum = this.frameParser.getPackageCacheNum('Video');
+ beforeParseTime = Date.now();
+ }
- onOpenSocket(state) {
- this.socketHasOpenned = true;
- this.wsState = state;
- // page visibility场景检查socket状态后延迟处理,此处刷新socket状态,避免在延迟时间里close触发重连后,page visibility再次重连。
- this.updateSocketWorkerState(WORKER_STATE.LIVE, state);
- this.reconnection.can = true;
- this.reconnection.count = 0;
- this.reconnection.reconnecting = false;
-
- // 发送启动命令获取音视频数据
- switch (this._action) {
- case 'reconnect':
- this._reconnect();
- break;
- default:
- this.appState = APP_STATE_FROM_CLIENT.connected;
- this.subscribe.trigger('appStateChange', { ...this.appState });
- this.startCloudPhone();
- this.listenPageVisibility();
- this.listenPageShow();
- }
- }
+ this.frameParser.readPackage(data);
+ /*global __IS_DEBUG__*/
+ if (__IS_DEBUG__ && this.frameParser.getPackageCacheNum('Video') - videoNum > 0) {
+ let traceId = window.delayAnalysis.allocTraceId();
+ window.delayAnalysis.record(['receive', 'end', traceId], null, time);
+ window.delayAnalysis.record(['parse', 'start', traceId], null, beforeParseTime);
+ window.delayAnalysis.record(['parse', 'end', traceId]);
+ window.delayAnalysis.cacheTraceId('receive', traceId);
+ }
- triggerSubscribe(event, data) {
- this.subscribe.trigger(event.name, data);
- }
+ // 计算网络时延
+ const tempNetworkInfo = this.networkInfo;
+ tempNetworkInfo.kbitCount += (data || []).byteLength / K_UNIT;
- onMessage(data, time) {
- this.lastReceivingTime = time;
-
- let videoNum = 0;
- let beforeParseTime = 0;
- /*global __IS_DEBUG__*/
- if (__IS_DEBUG__) {
- videoNum = this.frameParser.getPackageCacheNum('Video');
- beforeParseTime = Date.now();
- }
-
- this.frameParser.readPackage(data);
- /*global __IS_DEBUG__*/
- if (
- __IS_DEBUG__ &&
- this.frameParser.getPackageCacheNum('Video') - videoNum > 0
- ) {
- let traceId = window.delayAnalysis.allocTraceId();
- window.delayAnalysis.record(['receive', 'end', traceId], null, time);
- window.delayAnalysis.record(
- ['parse', 'start', traceId],
- null,
- beforeParseTime,
- );
- window.delayAnalysis.record(['parse', 'end', traceId]);
- window.delayAnalysis.cacheTraceId('receive', traceId);
- }
-
- // 计算网络时延
- const tempNetworkInfo = this.networkInfo;
- tempNetworkInfo.kbitCount += (data || []).byteLength / K_UNIT;
-
- const SnapshotPkg = this.frameParser.shiftPackage('Snapshot');
- if (SnapshotPkg) {
- const imgBase64 =
- 'data:image/jpg;base64,' +
- window.btoa(this.arrayBufferToBase64(SnapshotPkg));
- if (imgBase64) {
- this.subscribe.trigger('phoneViewChange', imgBase64);
+ if (this.frameParser.shiftPackage('HeartBeat')) {
+ this.__calcNetworkState();
}
- }
- const cmdControlPkg = this.frameParser.shiftPackage('CmdControl');
- this.processCmdControlResp(cmdControlPkg);
- const phoneControlPkg = this.frameParser.shiftPackage('PhoneControl');
- this.processPhoneControlResp(phoneControlPkg);
+ const SnapshotPkg = this.frameParser.shiftPackage('Snapshot');
+ if (SnapshotPkg) {
+ const imgBase64 =
+ 'data:image/jpg;base64,' +
+ window.btoa(this.arrayBufferToBase64(SnapshotPkg));
+ if (imgBase64) {
+ this.subscribe.trigger('phoneViewChange', imgBase64);
+ }
+ }
+
+ const cmdControlPkg = this.frameParser.shiftPackage('CmdControl');
+ this.processCmdControlResp(cmdControlPkg);
+
+ const phoneControlPkg = this.frameParser.shiftPackage('PhoneControl');
+ this.processPhoneControlResp(phoneControlPkg);
+
+ // 若启动竖屏,CAE不发送旋转msg
+ const orientationPkg = this.frameParser.shiftPackage('Orientation');
+ if (orientationPkg) {
+ let pkgBody = orientationPkg & 0xFF;
+ const orientation = PROTOCOL_CONFIG.ORIENTATION[pkgBody];
+ Logger.debug('Orientation change:' + orientation);
+ this.pkgBody = pkgBody;
+ this.orientation = orientation;
+ this.updateResolutionAndTouch();
+ }
- const channelDataPkg = this.frameParser.shiftPackage('Channel');
- if (channelDataPkg) {
- this.processChannelData(channelDataPkg);
+ const channelDataPkg = this.frameParser.shiftPackage('Channel');
+ if (channelDataPkg) {
+ this.processChannelData(channelDataPkg)
+ }
}
- }
+
arrayBufferToBase64(buffer) {
const uint8Array = new Uint8Array(buffer);
const data = uint8Array.reduce(
@@ -345,557 +461,669 @@ class AppController {
return data;
}
- __calcNetworkState() {
- if (this.networkInfo.heartBeatSendTimes.length > 0) {
- this.networkInfo.delay =
- this.lastReceivingTime - this.networkInfo.heartBeatSendTimes.shift();
+ updateResolutionAndTouch() {
+ if (this.player && this.orientation) {
+ // resize之前更新canvas大小
+ if (this.options.isMobile) {
+ this.directionHandler.updateMobileCanvasSize(this.orientation, this.isMSE);
+ } else {
+ this.directionHandler.updateCanvasSize(this.orientation, this.isMSE);
+ }
+ this.touchHandler.updateOrientation(this.orientation);
+ this.autoRotation && this.autoRotation.updateOrientation(this.orientation, this.touchHandler.displayBox, this.directionHandler);
+ }
}
- if (this.lastReceivingTime !== this.networkInfo.lastRefreshTime) {
- this.networkInfo.bitRate = Math.round(
- (this.networkInfo.kbitCount * K_BIT_UNIT) /
- (this.lastReceivingTime - this.networkInfo.lastRefreshTime),
- );
- this.networkInfo.lastRefreshTime = this.lastReceivingTime;
- this.networkInfo.kbitCount = 0;
- }
- }
+
+ __calcNetworkState() {
+ if (this.networkInfo.heartBeatSendTimes.length > 0) {
+ this.networkInfo.delay = this.lastReceivingTime - this.networkInfo.heartBeatSendTimes.shift();
+ }
- onError() {
- this.appState = APP_STATE_FROM_CLIENT.unreachable;
- this.subscribe.trigger('appStateChange', { ...this.appState });
+ if (this.lastReceivingTime !== this.networkInfo.lastRefreshTime) {
+ this.networkInfo.bitRate = Math.round(this.networkInfo.kbitCount * K_BIT_UNIT / (this.lastReceivingTime - this.networkInfo.lastRefreshTime));
+ this.networkInfo.lastRefreshTime = this.lastReceivingTime;
+ this.networkInfo.kbitCount = 0;
+ }
+
+ this.subscribe.trigger('netStateChange', {
+ delay: this.networkInfo.delay,
+ bitrate: this.networkInfo.bitRate
+ });
}
- processCmdControlResp(pkg) {
- if (!pkg) {
- return;
- }
-
- let buf = new Uint8Array(pkg);
- let text = '';
- buf.forEach(c => {
- text += String.fromCharCode(c);
- });
- let resp = this.params2JSON(text);
- let code = Number(resp.code);
- const codeConfig = PROTOCOL_CONFIG.CMD_RESP_TYPE;
- let needToTellExit = false;
- switch (code) {
- case codeConfig.CONNECT_FAILED:
- case codeConfig.VERIFY_FAILED:
- case codeConfig.START_FAILED:
- logger.debug('Receive failed response, disconnect');
- this.disconnect();
- break;
- case codeConfig.PLAY_TIMEOUT:
- logger.debug('Play timeout, disconnect');
- this.disconnect();
- break;
- case codeConfig.TOUCH_TIMEOUT:
- logger.debug('Touch timeout, disconnect');
- this.disconnect();
- break;
- case codeConfig.PAUSE_TIMEOUT:
- logger.debug('Pause timeout, disconnect');
- this.disconnect();
- break;
- case codeConfig.PHONE_CONNECTED_EXCEED_LIMIT:
- logger.debug('Phone connected exceed limit, disconnect');
- this.disconnect();
- break;
- case codeConfig.INVALID_OPERATION:
- case codeConfig.RECONNECT_PARAMETER_INVALID:
- case codeConfig.RECONNECT_SERVER_UNREACHABLE:
- case codeConfig.RECONNECT_ENGING_START_ERROR:
- // 重连后未重连成功前接收到无效操作,则认为重连失败。场景为:iphone手机切后台导致断连超时后切回应用重连的场景
- if (this.appState.state === APP_STATE_FROM_CLIENT.reconnecting.state) {
- logger.debug('Reconnect faild, disconnect');
- this.disconnect();
- needToTellExit = true;
- }
-
- break;
- case codeConfig.H265_NOT_SUPPORT:
- this.startParams.media_config.frame_type = FRAME_TYPE_MAP.TYPE264;
- this.startCloudPhone();
- break;
- default:
- break;
- }
-
- const tip = APP_STATE_ERROR_CODE_TIP[resp.code];
- this.appState = { state: Number(resp.code), message: resp.msg, tip };
- this.subscribe.trigger('appStateChange', { ...this.appState });
- if (needToTellExit) {
- this.appState = APP_STATE_FROM_CLIENT.exit;
- this.subscribe.trigger('appStateChange', { ...this.appState });
+ onError() {
+ this.appState = APP_STATE_FROM_CLIENT.unreachable;
+ this.subscribe.trigger('appStateChange', {...this.appState});
}
- }
- processPhoneControlResp(pkg) {
- if (!pkg) {
- return;
+ updateResolution() {
+ if (this.curResolution.width === this.nextResolution.width && this.curResolution.height === this.nextResolution.height) {
+ return;
+ }
+
+ this.touchHandler.updateResolution(this.nextResolution.width, this.nextResolution.height);
+ this.curResolution = this.nextResolution;
}
- const buf = new Uint8Array(pkg);
- if (!buf.length) {
- return;
+ processCmdControlResp(pkg) {
+ if (!pkg) {
+ return;
+ }
+
+ let buf = new Uint8Array(pkg);
+ let text = '';
+ buf.forEach(c => {
+ text += String.fromCharCode(c);
+ });
+ let resp = this.params2JSON(text);
+ let code = Number(resp.code);
+ const codeConfig = PROTOCOL_CONFIG.CMD_RESP_TYPE;
+ let needToTellExit = false;
+ switch (code) {
+ case codeConfig.CONNECT_FAILED:
+ case codeConfig.VERIFY_FAILED:
+ case codeConfig.START_FAILED:
+ Logger.debug('Receive failed response, disconnect');
+ this.disconnect();
+ break;
+ case codeConfig.PHONE_CONNECTED:
+ Logger.debug('Phone has connected, disconnect');
+ this.disconnect();
+ break;
+ case codeConfig.PLAY_TIMEOUT:
+ Logger.debug('Play timeout, disconnect');
+ this.disconnect();
+ break;
+ case codeConfig.TOUCH_TIMEOUT:
+ Logger.debug('Touch timeout, disconnect');
+ this.disconnect();
+ break;
+ case codeConfig.PAUSE_TIMEOUT:
+ Logger.debug('Pause timeout, disconnect');
+ this.disconnect();
+ break;
+ case codeConfig.PHONE_CONNECTED_EXCEED_LIMIT:
+ logger.debug('Phone connected exceed limit, disconnect');
+ this.disconnect();
+ break;
+ case codeConfig.START_SUCCESS:
+ this.startPlay();
+ this.isMSE = true;
+ this.initPlyerAndStart();
+ this.updateResolution();
+ break;
+ case codeConfig.INVALID_OPERATION:
+ case codeConfig.RECONNECT_PARAMETER_INVALID:
+ case codeConfig.RECONNECT_FAILED:
+ case codeConfig.RECONNECT_SERVER_UNREACHABLE:
+ case codeConfig.RECONNECT_ENGING_START_ERROR:
+ // 重连后未重连成功前接收到无效操作,则认为重连失败。场景为:iphone手机切后台导致断连超时后切回应用重连的场景
+ if (this.appState.state === APP_STATE_FROM_CLIENT.reconnecting.state) {
+ Logger.debug('Reconnect faild, disconnect');
+ this.disconnect();
+ needToTellExit = true;
+ }
+
+ break;
+ case codeConfig.H265_NOT_SUPPORT:
+ this.startParams.media_config.frame_type = FRAME_TYPE_MAP.TYPE264;
+ this.startCloudPhone();
+ break;
+ default:
+ break;
+ }
+
+ const tip = APP_STATE_ERROR_CODE_TIP[resp.code];
+ this.appState = {state: Number(resp.code), message: resp.msg, tip};
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ if (needToTellExit) {
+ this.appState = APP_STATE_FROM_CLIENT.exit;
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ }
}
- const code = buf[0];
- const stateConfig = PROTOCOL_CONFIG.PHONE_CONNECTION_STATE[code];
- if (stateConfig) {
- logger.debug(stateConfig.message);
- this.appState = stateConfig;
- this.subscribe.trigger('appStateChange', { ...this.appState });
+ processPhoneControlResp(pkg) {
+ if (!pkg) {
+ return;
+ }
+
+ const buf = new Uint8Array(pkg);
+ if (!buf.length) {
+ return;
+ }
+
+ const code = buf[0];
+ const stateConfig = PROTOCOL_CONFIG.PHONE_CONNECTION_STATE[code];
+ if (stateConfig) {
+ Logger.debug(stateConfig.message);
+ this.appState = stateConfig;
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ }
}
- }
- processChannelData(pkg) {
- this.subscribe.trigger('cloudAppData', pkg.buffer);
- }
+ processChannelData(pkg) {
+ this.subscribe.trigger('cloudAppData', pkg.buffer);
+ }
- recordHeartbeat(time) {
- if (
- this.networkInfo.heartBeatSendTimes.length <=
- this.networkInfo.sendTimesMaxCount
- ) {
- this.networkInfo.heartBeatSendTimes.push(time);
- } else {
- this.networkInfo.heartBeatSendTimes = [];
- this.terminateSocketWorker();
- setTimeout(() => {
- this.createSocket();
- this.reconnect();
- }, 0);
+ recordHeartbeat(time) {
+ if (this.networkInfo.heartBeatSendTimes.length <= this.networkInfo.sendTimesMaxCount){
+ this.networkInfo.heartBeatSendTimes.push(time);
+ } else {
+ this.networkInfo.heartBeatSendTimes = []
+ this.terminateSocketWorker();
+ setTimeout(() => {
+ this.createSocket();
+ this.reconnect();
+ }, 0);
+ }
}
- }
- tryReconnect(trigger) {
- // client自主断连和CAE断连外认为异常断连,尝试重连
- const tempReconnection = this.reconnection;
- tempReconnection.reconnecting = true;
- tempReconnection.trigger = trigger;
- if (
- tempReconnection.can &&
- tempReconnection.count < tempReconnection.maxTimes
- ) {
- tempReconnection.count++;
- tempReconnection.timerHander &&
- clearTimeout(tempReconnection.timerHander);
- // 延迟reconnect,但需立即触发appStateChange,以便客户显示loading。
- this.appState = this.socketHasOpenned
- ? APP_STATE_FROM_CLIENT.reconnecting
- : APP_STATE_FROM_CLIENT.connecting;
- this.subscribe.trigger('appStateChange', { ...this.appState });
- tempReconnection.timerHander = setTimeout(() => {
- this.reconnect();
- }, tempReconnection.timerDelay);
- }
-
- // 若重连,会在重连失败后更新appState;若不重连,则直接更新appState。websocket初始建连失败时会进入error和close回调,此时更新为exit状态并不合适。
- if (
- tempReconnection.maxTimes === 0 &&
- this.appState.state === APP_STATE_FROM_CLIENT.connected.state
- ) {
- this.appState = APP_STATE_FROM_CLIENT.exit;
- this.subscribe.trigger('appStateChange', { ...this.appState });
+ tryReconnect(trigger) {
+ // client自主断连和CAE断连外认为异常断连,尝试重连
+ const tempReconnection = this.reconnection;
+ tempReconnection.reconnecting = true;
+ tempReconnection.trigger = trigger;
+ if (tempReconnection.can && tempReconnection.count < tempReconnection.maxTimes) {
+ tempReconnection.count++;
+ tempReconnection.timerHander && clearTimeout(tempReconnection.timerHander);
+ // 延迟reconnect,但需立即触发appStateChange,以便客户显示loading。
+ this.appState = this.socketHasOpenned ? APP_STATE_FROM_CLIENT.reconnecting : APP_STATE_FROM_CLIENT.connecting;
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ tempReconnection.timerHander = setTimeout(() => {
+ this.reconnect();
+ }, tempReconnection.timerDelay);
+ }
+
+ // 若重连,会在重连失败后更新appState;若不重连,则直接更新appState。websocket初始建连失败时会进入error和close回调,此时更新为exit状态并不合适。
+ if (tempReconnection.maxTimes === 0 && this.appState.state === APP_STATE_FROM_CLIENT.connected.state) {
+ this.appState = APP_STATE_FROM_CLIENT.exit;
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ }
}
- }
- onClose(state, trigger) {
- this.wsState = state;
- // 断连后清除心跳缓存,规避“断连前发送心跳,异常无法收到心跳响应,断连后重连,恢复心跳后心跳响应和发送错位导致时延计算错误”的问题
- this.networkInfo.heartBeatSendTimes = [];
- logger.debug('Websocket close. Triggered by ' + trigger);
- this.tryReconnect(trigger);
- }
+ onClose(state, trigger) {
+ this.wsState = state;
+ // 断连后清除心跳缓存,规避“断连前发送心跳,异常无法收到心跳响应,断连后重连,恢复心跳后心跳响应和发送错位导致时延计算错误”的问题
+ this.networkInfo.heartBeatSendTimes = [];
+ Logger.debug('Websocket close. Triggered by ' + trigger);
+ this.tryReconnect(trigger);
- getCheckSum(msgType) {
- return (
- (msgType +
- ((CAE_STREAM_DELIMITER_MAGICWORD >> 8) & 0xff) +
- (CAE_STREAM_DELIMITER_MAGICWORD & 0xff)) &
- 0xff
- );
- }
+ if (this.keyboardInput) {
+ this.keyboardInput.blurInput();
+ }
+ }
+
+ getCheckSum(msgType) {
+ return (msgType + ((CAE_STREAM_DELIMITER_MAGICWORD >> 8) & 0xFF) + (CAE_STREAM_DELIMITER_MAGICWORD & 0xFF)) & 0xFF;
+ }
- paramsSerialize(params) {
- if (params) {
- let kvs = Object.keys(params).map(key => {
- let value = params[key];
- if (typeof value === 'object') {
- value = Object.keys(value)
- .map(subKey =>
- [subKey, encodeURIComponent(value[subKey])].join('='),
- )
- .join(':');
- return [key, value].join('=');
+ paramsSerialize(params) {
+ if (params) {
+ let kvs = Object.keys(params).map(key => {
+ let value = params[key];
+ if (key === 'ticket') {
+ return [key, value].join('=')
+ }
+ if (typeof value === 'object') {
+ value = Object.keys(value).map(subKey => [subKey, encodeURIComponent(value[subKey])].join('=')).join(':');
+ return [key, value].join('=');
+ }
+
+ return [key, encodeURIComponent(value)].join('=');
+ });
+ return kvs.join('&');
}
- return [key, encodeURIComponent(value)].join('=');
- });
- return kvs.join('&');
+ return '';
}
- return '';
- }
+ params2JSON(params = '') {
+ let json = {};
+ params.split('&').forEach(kv => {
+ let [key, val] = kv.split('=');
+ json[key] = val;
+ });
+ return json;
+ }
- params2JSON(params = '') {
- let json = {};
- params.split('&').forEach(kv => {
- let [key, val] = kv.split('=');
- json[key] = val;
- });
- return json;
- }
+ /**
+ * 根据协议构造发送给CAE的消息
+ * @param {object} typedBuf 8位无符号整型数组Uint8Array
+ * @param {string} msgType 消息类型,值为protocalConfig配置的key
+ * @param {number} msgBodyLen 消息内容长度
+ */
+ setMsgHeader(typedBuf, msgType, msgBodyLen) {
+ typedBuf[0] = 90;
+ typedBuf[1] = 90;
+ typedBuf[2] = this.getCheckSum(PROTOCOL_CONFIG.MSG_TYPE[msgType]);
+ typedBuf[3] = PROTOCOL_CONFIG.MSG_TYPE[msgType];
+ typedBuf[4] = msgBodyLen >> 24;
+ typedBuf[5] = msgBodyLen >> 16;
+ typedBuf[6] = msgBodyLen >> 8;
+ typedBuf[7] = msgBodyLen;
+ }
- /**
- * 根据协议构造发送给CAE的消息
- * @param {object} typedBuf 8位无符号整型数组Uint8Array
- * @param {string} msgType 消息类型,值为protocalConfig配置的key
- * @param {number} msgBodyLen 消息内容长度
- */
- setMsgHeader(typedBuf, msgType, msgBodyLen) {
- typedBuf[0] = 90;
- typedBuf[1] = 90;
- typedBuf[2] = this.getCheckSum(PROTOCOL_CONFIG.MSG_TYPE[msgType]);
- typedBuf[3] = PROTOCOL_CONFIG.MSG_TYPE[msgType];
- typedBuf[4] = msgBodyLen >> 24;
- typedBuf[5] = msgBodyLen >> 16;
- typedBuf[6] = msgBodyLen >> 8;
- typedBuf[7] = msgBodyLen;
- }
+ /**
+ * 根据协议构造发送给CAE的消息
+ * @param {string} msgType 消息类型,值为protocalConfig配置的key
+ * @param {object} params 待转成消息体的控制参数
+ * @return {object} 返回消息ArrayBuffer
+ */
+ makeActionMsg(msgType, msgCmd, params = {}) {
+ const MSG_CMD_MAP = {...PROTOCOL_CONFIG.CMD_TYPE};
- /**
- * 根据协议构造发送给CAE的消息
- * @param {string} msgType 消息类型,值为protocalConfig配置的key
- * @param {object} params 待转成消息体的控制参数
- * @return {object} 返回消息ArrayBuffer
- */
- makeActionMsg(msgType, msgCmd, params = {}) {
- const MSG_CMD_MAP = { ...PROTOCOL_CONFIG.CMD_TYPE };
-
- let msgBody = this.paramsSerialize({
- command: MSG_CMD_MAP[msgCmd],
- ...params,
- });
- let msgBodyLen = msgBody.length;
- let typedBuf = new Uint8Array(PACKAGE_HEADER_LENGTH + msgBodyLen);
- for (let i = 0; i < msgBodyLen; i++) {
- typedBuf[PACKAGE_HEADER_LENGTH + i] = msgBody.charCodeAt(i);
- }
-
- this.setMsgHeader(typedBuf, msgType, msgBodyLen);
- return typedBuf.buffer;
- }
+ let msgBody = this.paramsSerialize({
+ command: MSG_CMD_MAP[msgCmd],
+ ...params
+ });
+ let msgBodyLen = msgBody.length;
+ let typedBuf = new Uint8Array(PACKAGE_HEADER_LENGTH + msgBodyLen);
+ for (let i = 0; i < msgBodyLen; i++) {
+ typedBuf[PACKAGE_HEADER_LENGTH + i] = msgBody.charCodeAt(i);
+ }
- /**
- * 根据协议构造发送给CAE的消息
- * @param {string} msgType 消息类型,值为protocalConfig配置的key
- * @param {object} data 待发送的消息数据,ArrayBuffer类型
- * @return {object} 返回消息ArrayBuffer
- */
- makeDataMsg(msgType, data) {
- let msgBodyLen = data.byteLength;
- let typedBuf = new Uint8Array(PACKAGE_HEADER_LENGTH + msgBodyLen);
- typedBuf.set(new Uint8Array(data), PACKAGE_HEADER_LENGTH);
- this.setMsgHeader(typedBuf, msgType, msgBodyLen);
-
- return typedBuf.buffer;
- }
+ this.setMsgHeader(typedBuf, msgType, msgBodyLen);
+ return typedBuf.buffer;
+ }
- verifiedData() {
- const userOptions = this.options;
- return {
- ip: userOptions.phoneIp,
- port: userOptions.phonePort,
- session_id: this.sessionId,
- backgroundTimeout: userOptions.backgroundTimeout,
- available_playtime: userOptions.availablePlayTime,
- user_id: userOptions.userId,
- };
- }
+ /**
+ * 根据协议构造发送给CAE的消息
+ * @param {string} msgType 消息类型,值为protocalConfig配置的key
+ * @param {object} data 待发送的消息数据,ArrayBuffer类型
+ * @return {object} 返回消息ArrayBuffer
+ */
+ makeDataMsg(msgType, data) {
+ let msgBodyLen = data.byteLength;
+ let typedBuf = new Uint8Array(PACKAGE_HEADER_LENGTH + msgBodyLen);
+ typedBuf.set(new Uint8Array(data), PACKAGE_HEADER_LENGTH);
+ this.setMsgHeader(typedBuf, msgType, msgBodyLen);
- initParams(cipherText, verify, iv) {
- this.startParams = {
- client_mode: "management",
- ticket: this.options.ticket,
- session_id: this.sessionId,
- auth_ts: this.options.authTimeStamp,
- verify_data: verify,
- encrypted_data: cipherText,
- aes_iv: iv,
- sdk_version: this.options.sdkVersion,
- protocol_version: 'v2',
- client_type: this.options.isMobile ? '4' : '3',
- operate_type: 'screenshot',
- media_config: {
- ...this.options.mediaConfig,
- frame_type: this.options.decoderType
- ? this.options.decoderType.toLowerCase()
- : FRAME_TYPE_MAP.TYPE264,
- quality: PROTOCOL_CONFIG[DEFAULT_DEFINITION].quality,
- },
- };
- // ios/android接入,切到home后有可能会停止发送心跳,该场景下切home超时不生效,切home超时由断连超时决定。
- if (this.options.isMobile) {
- this.startParams.max_disconnect_duration = this.options.backgroundTimeout;
+ return typedBuf.buffer;
}
- }
- start() {
- let crypt = new AESGCMCrypto();
- let iv = crypt.iv();
- let verifiedData = this.verifiedData();
- let encryptedData = {
- ...verifiedData,
- touch_timeout: this.options.touchTimeout,
- };
- Promise.all([
- crypt.encrypt(JSON.stringify(encryptedData), this.options.aesKey, iv),
- crypt.abstract(Object.values(verifiedData).join('')),
- ]).then(([cipherText, verifyText]) => {
- this.initParams(cipherText, verifyText, iv);
- if (cipherText) {
- this.appState = APP_STATE_FROM_CLIENT.connecting;
- this.subscribe.trigger('appStateChange', { ...this.appState });
- this.connect();
- }
- });
- }
+ decode(data) {
+ this.avc.decode(data);
+ }
- connect() {
- if (!this.options.connectURI) {
- return;
+ verifiedData() {
+ const userOptions = this.options;
+ return {
+ ip: userOptions.phoneIp,
+ port: userOptions.phonePort,
+ session_id: this.sessionId,
+ backgroundTimeout: userOptions.backgroundTimeout,
+ available_playtime: userOptions.availablePlayTime,
+ user_id: userOptions.userId
+ };
}
- this.initSocket(this.options.connectURI);
- }
+ initParams(cipherText, verify, iv) {
+ this.startParams = {
+ client_mode: "management",
+ ticket: this.options.ticket,
+ session_id: this.sessionId,
+ auth_ts: this.options.authTimeStamp,
+ verify_data: verify,
+ encrypted_data: cipherText,
+ aes_iv: iv,
+ sdk_version: this.options.sdkVersion,
+ protocol_version: 'v2',
+ operate_type: 'screenshot',
+ client_type: this.options.isMobile ? '4' :'3',
+ media_config: {
+ ...this.options.mediaConfig,
+ frame_type: this.options.decoderType ? this.options.decoderType.toLowerCase() : FRAME_TYPE_MAP.TYPE264,
+ quality: PROTOCOL_CONFIG[DEFAULT_DEFINITION].quality
+ }
+ };
+ // ios/android接入,切到home后有可能会停止发送心跳,该场景下切home超时不生效,切home超时由断连超时决定。
+ if (this.options.isMobile) {
+ this.startParams.max_disconnect_duration = this.options.backgroundTimeout;
+ }
- disconnect(callbackFn) {
- // client自动断连场景不重连
- this.reconnection.can = false;
- this.stopCloudPhone();
- this.stopHeartbeat();
- // 延迟关闭socket,避免CAE在关闭前接收不到stop cmd
- setTimeout(() => {
- this.closeSocket();
- if (callbackFn) {
- callbackFn();
- }
- }, 1000);
- }
+ if (this.startParams.media_config.physical_width && this.startParams.media_config.physical_height) {
+ this.nextResolution = {
+ width: this.startParams.media_config.physical_width,
+ height: this.startParams.media_config.physical_height
+ };
+ }
+ }
- /*
- * 尝试重连有两种场景:1.首次连接,连接失败;2、已有连接断开后重连,重连失败后再重连
- * 断线后重连,15s内重连,15s后CAE清理资源
- */
- reconnect() {
- this._action = this.socketHasOpenned ? 'reconnect' : 'connect';
- this.connect();
- }
+ start() {
+ let crypt = new AESGCMCrypto();
+ let iv = crypt.iv();
+ let verifiedData = this.verifiedData();
+ let encryptedData = {...verifiedData, touch_timeout: this.options.touchTimeout};
+ Promise.all([
+ crypt.encrypt(JSON.stringify(encryptedData), this.options.aesKey, iv),
+ crypt.abstract(Object.values(verifiedData).join(''))
+ ]).then(([cipherText, verifyText]) => {
+ this.initParams(cipherText, verifyText, iv);
+ if (cipherText) {
+ this.appState = APP_STATE_FROM_CLIENT.connecting;
+ this.subscribe.trigger('appStateChange', {...this.appState});
+ this.connect();
+ }
+ });
+ }
- _reconnect() {
- let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'RECONNECT', {
- session_id: this.sessionId,
- });
- arrayBuf && this.send(arrayBuf);
- }
+ connect() {
+ if (!this.options.connectURI) {
+ return;
+ }
- // 发送启动命令获取音视频数据,启动样例
- startCloudPhone() {
- let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'START', this.startParams);
- arrayBuf && this.send(arrayBuf);
- }
+ this.initSocket(this.options.connectURI);
+ }
- // 停止样例
- stopCloudPhone() {
- const arrayBuf = this.makeActionMsg('CMD_CONTROL', 'STOP');
- arrayBuf && this.send(arrayBuf);
- }
+ startPlay() {
+ this.playing = true;
+ }
- // 暂停样例
- // 用于home切换场景,暂停后,CAE停止发送数据
- pauseCloudPhone() {
- const arrayBuf = this.makeActionMsg('CMD_CONTROL', 'PAUSE');
- arrayBuf && this.send(arrayBuf);
- }
+ stopPlay() {
+ this.playing = false;
+ }
- // 恢复样例
- // 切换至home,暂停;60s内切回则发送恢复指令恢复,60s后切回,CAE清理资源,需要重新申请云手机
- resumeCloudPhone() {
- this._resumeCloudPhone();
- }
+ __canvasPlay(frame) {
+ this.decode(frame);
+ }
- _resumeCloudPhone() {
- let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'RESUME', {
- session_id: this.sessionId,
- });
- arrayBuf && this.send(arrayBuf);
- }
+ toLastest() {
+ let video = this.player;
+ let action = () => {
+ if (video.buffered && video.buffered.length && video.buffered.end(0)) {
+ video.currentTime = video.buffered.end(0);
+ }
- recoverAfterWorkerDead(trigger) {
- this.socketWorker && this.socketWorker.terminate();
- this.createSocket();
- this.onClose(WEBSOCKET_READY_STATE.CLOSED, trigger);
- }
+ video.removeEventListener('canplaythrough', action);
+ };
+
+ video.addEventListener('canplaythrough', action);
+ }
+
+ disconnect(callbackFn) {
+ // client自动断连场景不重连
+ this.reconnection.can = false;
+ this.stopCloudPhone();
+ this.stopHeartbeat();
+ // 延迟关闭socket,避免CAE在关闭前接收不到stop cmd
+ setTimeout(() => {
+ this.closeSocket();
+ if (callbackFn) {
+ callbackFn();
+ }
+ }, 1000);
+ }
- checkAndRecoverSocket(trigger) {
/*
- * iOS Safari切home后再回到手机界面,有可能出现socket worker无反应情况(socket已断开,却没有接收到close事件)
- * 主动给socket worker发送信息,200ms内没有从socket worker接收到响应或socket已经close,且未触发close事件(重连机制在close事件处理中触发),主动触发重连
- * 认为200ms内足以触发close事件及接收到从socket worket的响应
- */
- this.checkSocketWorkerState();
- setTimeout(() => {
- if (!this.reconnection.reconnecting && !this.isSocketAvailable()) {
- this.recoverAfterWorkerDead(trigger);
- }
- }, 200);
- }
+ * 尝试重连有两种场景:1.首次连接,连接失败;2、已有连接断开后重连,重连失败后再重连
+ * 断线后重连,15s内重连,15s后CAE清理资源
+ */
+ reconnect() {
+ this._action = this.socketHasOpenned ? 'reconnect' : 'connect';
+ this.connect();
+ }
- listenPageVisibility() {
- let hidden;
- if (typeof document.hidden !== 'undefined') {
- hidden = 'hidden';
- this.visibilityChange = 'visibilitychange';
- } else if (typeof document.msHidden !== 'undefined') {
- hidden = 'msHidden';
- this.visibilityChange = 'msvisibilitychange';
- } else if (typeof document.webkitHidden !== 'undefined') {
- hidden = 'webkitHidden';
- this.visibilityChange = 'webkitvisibilitychange';
- }
-
- this.handleVisibilityChange = () => {
- if (document[hidden] && this.currentVisible == 'visibility') {
- // 页面隐藏后停止发送心跳
- logger.debug('Page hidden, pause');
- this.pauseCloudPhone();
- this.currentVisible = 'hidden';
- } else if (
- this.wsState === WEBSOCKET_READY_STATE.OPEN &&
- this.currentVisible == 'hidden'
- ) {
- logger.debug('Page visibility, resume');
- // 恢复虚拟设备发送数据
- this.resumeCloudPhone();
- this.currentVisible = 'visibility';
- }
- };
+ _reconnect() {
+ let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'RECONNECT', {
+ session_id: this.sessionId
+ });
+ arrayBuf && this.send(arrayBuf);
+ }
- // 判断浏览器的支持情况
- if (typeof document[hidden] !== 'undefined') {
- this.util.bind(
- document,
- this.visibilityChange,
- this.handleVisibilityChange,
- );
+ // 发送启动命令获取音视频数据,启动样例
+ startCloudPhone() {
+ let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'START', this.startParams);
+ arrayBuf && this.send(arrayBuf);
}
- }
- // 主要处理当前页打开其他页面后再次返回手机页面,从缓存加载,需重连的场景
- listenPageShow() {
- let isPageHide = false;
- window.addEventListener('pageshow', () => {
- if (isPageHide) {
- isPageHide = false;
- this.checkAndRecoverSocket('pageshow');
- }
- });
- window.addEventListener('pagehide', () => {
- isPageHide = true;
- });
- }
+ // 停止样例
+ stopCloudPhone() {
+ const arrayBuf = this.makeActionMsg('CMD_CONTROL', 'STOP');
+ arrayBuf && this.send(arrayBuf);
+ }
- static isSupport() {
- let isSptSocket = window.WebSocket;
- return Boolean(isSptSocket);
- }
+ // 暂停样例
+ // 用于home切换场景,暂停后,CAE停止发送数据
+ pauseCloudPhone() {
+ const arrayBuf = this.makeActionMsg('CMD_CONTROL', 'PAUSE');
+ arrayBuf && this.send(arrayBuf);
+ }
- static isSupportURL() {
- let url = window.URL || window.webkitURL;
- return Boolean(url.createObjectURL);
- }
+ // 恢复样例
+ // 切换至home,暂停;60s内切回则发送恢复指令恢复,60s后切回,CAE清理资源,需要重新申请云手机
+ resumeCloudPhone() {
+ this._resumeCloudPhone();
+ }
- on(eventName, callback) {
- this.subscribe.on(eventName, callback);
- }
+ _resumeCloudPhone() {
+ let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'RESUME', {
+ session_id: this.sessionId
+ });
+ arrayBuf && this.send(arrayBuf);
+ }
- off(eventName, callback) {
- this.subscribe.off(eventName, callback);
- }
+ // 设置画质
+ setResolution(clarityVal) {
+ const config = PROTOCOL_CONFIG[clarityVal];
+ if (this.startParams.media_config && this.startParams.media_config.bitrate) {
+ config.bitrate = this.startParams.media_config.bitrate;
+ }
- generateGUID() {
- return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, c => {
- const r = (AESGCMCrypto.getRandomValue() * 16) | 0;
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
- return v.toString(16);
- });
- }
+ this.setMediaConfig(config);
+ }
- exit() {
- this.disconnect(this.terminateSocketWorker.bind(this));
- this.destroy(true);
- }
+ // 设置音视频参数
+ setMediaConfig(config = {}) {
+ let arrayBuf = this.makeActionMsg('CMD_CONTROL', 'SET_MEDIA_CONFIG', {
+ media_config: config
+ });
+ arrayBuf && this.send(arrayBuf);
+ if (config.stream_width && config.stream_height) {
+ this.nextResolution = {
+ width: config.stream_width,
+ height: config.stream_height
+ };
+ }
+ }
- terminateSocketWorker() {
- this.socketWorker && this.socketWorker.terminate();
- this.socketWorker = null;
- this.socket = null;
- }
+ recoverAfterWorkerDead(trigger) {
+ this.socketWorker && this.socketWorker.terminate();
+ this.createSocket();
+ this.onClose(WEBSOCKET_READY_STATE.CLOSED, trigger);
+ }
- updateSocketWorkerState(workerState, socketState) {
- this.socketWorkerState.worker = workerState;
- this.socketWorkerState.socket = socketState;
- }
+ checkAndRecoverSocket(trigger) {
+
+ /*
+ * iOS Safari切home后再回到手机界面,有可能出现socket worker无反应情况(socket已断开,却没有接收到close事件)
+ * 主动给socket worker发送信息,200ms内没有从socket worker接收到响应或socket已经close,且未触发close事件(重连机制在close事件处理中触发),主动触发重连
+ * 认为200ms内足以触发close事件及接收到从socket worket的响应
+ */
+ this.checkSocketWorkerState();
+ setTimeout(() => {
+ if (!this.reconnection.reconnecting && !this.isSocketAvailable()) {
+ this.recoverAfterWorkerDead(trigger);
+ }
+ }, 200);
+ }
- isSocketAvailable() {
- return (
- this.socketWorkerState.worker === WORKER_STATE.LIVE &&
- this.socketWorkerState.socket !== WEBSOCKET_READY_STATE.CLOSING &&
- this.socketWorkerState.socket !== WEBSOCKET_READY_STATE.CLOSED
- );
- }
+ listenPageVisibility() {
+ let hidden;
+ if (typeof document.hidden !== 'undefined') {
+ hidden = 'hidden';
+ this.visibilityChange = 'visibilitychange';
+ } else if (typeof document.msHidden !== 'undefined') {
+ hidden = 'msHidden';
+ this.visibilityChange = 'msvisibilitychange';
+ } else if (typeof document.webkitHidden !== 'undefined') {
+ hidden = 'webkitHidden';
+ this.visibilityChange = 'webkitvisibilitychange';
+ }
- setDefaultCamera(devId) {
- this.deviceHardwareHandler.setDefaultCamera(devId);
- }
+ this.handleVisibilityChange = () => {
+ if (document[hidden] && this.currentVisible == 'visibility') {
+ // 页面隐藏后停止发送心跳
+ Logger.debug('Page hidden, pause');
+ // 页面隐藏后虚拟设备停止发送数据
+ this.pauseCloudPhone();
+ this.currentVisible = 'hidden'
+ } else if (this.wsState === WEBSOCKET_READY_STATE.OPEN && this.currentVisible == 'hidden') {
+ Logger.debug('Page visibility, resume');
+ // 恢复虚拟设备发送数据
+ this.resumeCloudPhone();
+ this.currentVisible = 'visibility'
+ }
+ };
+
+ // 判断浏览器的支持情况
+ if (typeof document[hidden] !== 'undefined') {
+ this.util.bind(document, this.visibilityChange, this.handleVisibilityChange);
+ }
+ }
- getCameras() {
- let videoDevices = [];
- navigator.mediaDevices.enumerateDevices()
- .then(devices => {
- devices.forEach(device => {
- if (device.kind === "videoinput") {
- videoDevices.push(device);
- }
+ // 主要处理当前页打开其他页面后再次返回手机页面,从缓存加载,需重连的场景
+ listenPageShow() {
+ let isPageHide = false;
+ window.addEventListener('pageshow', () => {
+ if (isPageHide) {
+ isPageHide = false;
+ this.checkAndRecoverSocket('pageshow');
+ }
});
- console.log(videoDevices)
- // 输出视频摄像头列表
- return videoDevices;
- })
- .catch(error => {
- console.log("获取设备列表失败:", error);
- });
- }
+ window.addEventListener('pagehide', () => {
+ isPageHide = true;
+ });
+ }
- resetDefaultCamera() {
- this.deviceHardwareHandler.defaultCameraId = '';
- }
+ static isSupport() {
+ let isSptAudioCxt = window.AudioContext || window.webkitAudioContext;
+ let isSptSocket = window.WebSocket;
+ return Boolean(AESGCMCrypto.isSupport() && isSptAudioCxt && isSptSocket);
+ }
- /**
- * 销毁
- * @param {boolean}} reserveSocketWorker 是否需要销毁socket,exit场景,延迟close socket,close前需保留socket
- * @return {void}}
- */
- destroy(reserveSocketWorker) {
- if (!reserveSocketWorker) {
- this.terminateSocketWorker();
+ static isSupportURL() {
+ let url = window.URL || window.webkitURL;
+ return Boolean(url.createObjectURL);
+ }
+
+ on(eventName, callback) {
+ this.subscribe.on(eventName, callback);
+ }
+
+ off(eventName, callback) {
+ this.subscribe.off(eventName, callback);
+ }
+
+ generateGUID() {
+ return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, c => {
+ const r = AESGCMCrypto.getRandomValue() * 16 | 0;
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+ }
+
+ isCanvasPriority() {
+ // UA 判断
+ const userAgent = navigator && navigator.userAgent || '';
+ const isMatchUA = Object.values(CANVAS_WHITE_LIST).some(condition => userAgent.includes(condition));
+
+ // oppo 浏览器 UA 特征不明显,通过 window 对象属性进行判断
+ const isOppoBrowser = Boolean(window.OppoWebPage || window.OppoFlow || window.oppoErrorPage || window.oppoUrlQuery);
+ return isMatchUA || isOppoBrowser;
+ }
+
+ isMSEMode(frameType = FRAME_TYPE_MAP.TYPE265) {
+ // 使用 MSE 前提:
+ // (1) 支持 MediaSource
+ // (2) 支持 avc1.42c020 编码
+ // (3) 不在 canvas 白名单
+ // 前两条判断包含在 JMuxer.isSupported 方法中
+ let isMSE = true;
+ if (frameType === FRAME_TYPE_MAP.TYPE264) {
+ isMSE = Boolean(JMuxer.isSupported('video/mp4; codecs="avc1.42c020"')) && !this.isCanvasPriority();
+ } else {
+ isMSE = Boolean(JMuxer.isSupported('video/mp4; codecs="hev1"')) && !this.isCanvasPriority();
+ }
+
+ /*global __IS_DEBUG__*/
+ if (__IS_DEBUG__) {
+ const framework = this.util.getUrlSearchVal('framework');
+ // framework 无值时不进行处理,避免默认值影响 canvas 白名单效果
+ if (framework) {
+ isMSE = framework.toLowerCase() !== 'canvas';
+ }
+ }
+
+ return isMSE;
+ }
+
+ sendDataToCloudApp(data) {
+ if (!this.playing) {
+ return;
+ }
+
+ let arrayBuf = this.makeDataMsg('CHANNEL', data);
+ this.send(arrayBuf)
+ }
+
+ sendClipboardData(data) {
+ if (this.keyboardListener) {
+ this.keyboardListener.sendClipboardData(data);
+ }
+ if (this.keyboardInput) {
+ this.keyboardInput.sendClipboardData(data);
+ }
+ }
+
+ exit() {
+ this.disconnect(this.terminateSocketWorker.bind(this));
+ this.destroy(true);
+ }
+
+ terminateSocketWorker() {
+ this.socketWorker && this.socketWorker.terminate();
+ this.socketWorker = null;
+ this.socket = null;
+ }
+
+ updateSocketWorkerState(workerState, socketState) {
+ this.socketWorkerState.worker = workerState;
+ this.socketWorkerState.socket = socketState;
+ }
+
+ isSocketAvailable() {
+ return this.socketWorkerState.worker === WORKER_STATE.LIVE
+ && this.socketWorkerState.socket !== WEBSOCKET_READY_STATE.CLOSING
+ && this.socketWorkerState.socket !== WEBSOCKET_READY_STATE.CLOSED;
+ }
+
+ /**
+ * 销毁
+ * @param {boolean}} reserveSocketWorker 是否需要销毁socket,exit场景,延迟close socket,close前需保留socket
+ * @return {void}}
+ */
+ destroy(reserveSocketWorker) {
+ this.stopPlay();
+ this.jmuxer && this.jmuxer.destroy();
+ this.avc && this.avc.destroy();
+ this.touchHandler && this.touchHandler.destroy();
+ this.autoRotation && this.autoRotation.destroy();
+ this.fullscreen && this.fullscreen.destroy();
+ // 停止传感器
+ this.jmuxer = null;
+ this.avc = null;
+ this.touchHandler = null;
+ this.autoRotation = null;
+ this.keyboardInput = null;
+ this.fullscreen = null;
+
+ if (!reserveSocketWorker) {
+ this.terminateSocketWorker();
+ }
+
+ this.util.unbind(null, this.visibilityChange);
}
- this.util.unbind(null, this.visibilityChange);
- }
}
export default AppController;
--
Gitee
From 0b995853915580a64eaac6313a8beb26eac1b67e Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Fri, 3 Jan 2025 10:01:25 +0800
Subject: [PATCH 02/16] 1
---
sdk/demo/demo.html | 8 ++++----
sdk/src/AppController.js | 25 +++++++++++++++++++++----
2 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/sdk/demo/demo.html b/sdk/demo/demo.html
index c75a266..5bdc2d2 100644
--- a/sdk/demo/demo.html
+++ b/sdk/demo/demo.html
@@ -339,7 +339,7 @@ Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
@@ -575,7 +575,7 @@ Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
...cloudPhoneParams,
channelType: channelType,
ticket: '256random'.padStart(256, '0'),
- aes_key: '7f3545e9bd914d93a18409e6370dff33',
+ aes_key: '',
auth_ts: new Date().getTime(),
_debug: true,
auto_rotate: true,
diff --git a/sdk/src/AppController.js b/sdk/src/AppController.js
index 151a231..9a4fda2 100644
--- a/sdk/src/AppController.js
+++ b/sdk/src/AppController.js
@@ -146,6 +146,8 @@ class AppController {
reconnecting: false, // 用于标识已进入重连流程,避免page visibility、page show处理时判断是否要主动触发重连
trigger: '' // 标识什么事件触发了重连,visibilityChange/pageshow/socketCloseEvent
};
+ this.frameCount = 0;
+ this.lastTime = 0;
// 网络时延/码率
this.networkInfo = {
heartBeatSendTimes: [],
@@ -472,6 +474,21 @@ class AppController {
// 计算网络时延
const tempNetworkInfo = this.networkInfo;
tempNetworkInfo.kbitCount += (data || []).byteLength / K_UNIT;
+
+ this.frameCount++
+ if (this.lastTime == 0) {
+ this.lastTime = this.lastReceivingTime;
+ }
+ if (this.lastReceivingTime - this.lastTime > 1000) {
+ console.log(this.frameCount)
+ this.subscribe.trigger('netStateChange', {
+ delay: this.frameCount,
+ bitrate: this.networkInfo.bitRate
+ });
+ this.frameCount = 0;
+ this.lastTime = this.lastReceivingTime;
+ }
+
if (this.frameParser.shiftPackage('HeartBeat')) {
this.__calcNetworkState();
@@ -551,10 +568,10 @@ class AppController {
this.networkInfo.kbitCount = 0;
}
- this.subscribe.trigger('netStateChange', {
- delay: this.networkInfo.delay,
- bitrate: this.networkInfo.bitRate
- });
+ // this.subscribe.trigger('netStateChange', {
+ // delay: this.networkInfo.delay,
+ // bitrate: this.networkInfo.bitRate
+ // });
}
onError() {
--
Gitee
From 7e186686dff380f97c554ad072d698009672d969 Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Fri, 3 Jan 2025 11:04:42 +0800
Subject: [PATCH 03/16] 1
---
sdk/demo/demo.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/sdk/demo/demo.html b/sdk/demo/demo.html
index 5bdc2d2..a47f2cf 100644
--- a/sdk/demo/demo.html
+++ b/sdk/demo/demo.html
@@ -582,6 +582,10 @@ Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
libPath: commonLibPath, // 配置库文件地址
microPhoneOutputType: 'OPUS', // PCM或OPUS
keepRatio: false // 保持宽高比
+ keepRatio: false, // 保持宽高比
+ media_config:{
+ fps: 60
+ }
};
try {
if (CloudApp.isSupport()) {
--
Gitee
From ef9055d6422f6b55fedef6d191a38287bb4b74aa Mon Sep 17 00:00:00 2001
From: Yuan <294065614@qq.com>
Date: Fri, 3 Jan 2025 11:17:29 +0800
Subject: [PATCH 04/16] 1
---
sdk/server.crt | 89 ++++++++++
sdk/server.key | 27 +++
sdk/src/3rd/video-codec-lib/X264Encoder.js | 4 +-
sdk/src/3rd/video-codec-lib/X264Encoder.wasm | Bin 722364 -> 668234 bytes
sdk/src/CameraPlayer.js | 176 +++++++++++++------
sdk/src/worker/VideoEncoder.js | 97 ++++++----
6 files changed, 306 insertions(+), 87 deletions(-)
create mode 100644 sdk/server.crt
create mode 100644 sdk/server.key
diff --git a/sdk/server.crt b/sdk/server.crt
new file mode 100644
index 0000000..8bc689b
--- /dev/null
+++ b/sdk/server.crt
@@ -0,0 +1,89 @@
+-----BEGIN CERTIFICATE-----
+MIIGBzCCBO+gAwIBAgIQBCVQRkPlmhgZOz1v0QumczANBgkqhkiG9w0BAQsFADBu
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
+RFYgVExTIENBIC0gRzIwHhcNMjQxMjMwMDAwMDAwWhcNMjUwMzMwMjM1OTU5WjAi
+MSAwHgYDVQQDExdody5kZW1vLmppbmhhb2tqLmNvbS5jbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAPg985O12HOzDLHwZw2UnnR2yckLTXSCkqcWMDg4
+7sdWOvOtW0fj6Jysmbn2LTSQH2tKIgfO7AoEH79WnQEK+obyeDgWE/A6zUgkHZj9
+FV3yq5q0zINqt8s+bFq3HB3spO2FioaZcIhqDSyzgliF0WP4bZn1akzdb79ZCSKG
+QVOdSb6pRAQUjXJomavuXe5g3zp6trh7EXMAQN0VlbT68tCBhUAGsTE0ON4iPE35
+xWcS7HLTl9XnENPzkpgRRmJpPDqsu/JD0Cyelptw1vWGr48IwuisADPRcun8R8EW
+TkqRNTCgZ3L/DMiigXgvXHBsXKPxjl8tZ/d5VxPWE2z2XJ0CAwEAAaOCAuswggLn
+MB8GA1UdIwQYMBaAFHjfkZBf7t6s9sV169VMVVPvJEq2MB0GA1UdDgQWBBTOyE18
+swZboFKklYtVNF8SSXfqhDAiBgNVHREEGzAZghdody5kZW1vLmppbmhhb2tqLmNv
+bS5jbjA+BgNVHSAENzA1MDMGBmeBDAECATApMCcGCCsGAQUFBwIBFhtodHRwOi8v
+d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQG
+CCsGAQUFBwMBBggrBgEFBQcDAjCBgAYIKwYBBQUHAQEEdDByMCQGCCsGAQUFBzAB
+hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9j
+YWNlcnRzLmRpZ2ljZXJ0LmNvbS9FbmNyeXB0aW9uRXZlcnl3aGVyZURWVExTQ0Et
+RzIuY3J0MAwGA1UdEwEB/wQCMAAwggF/BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB3
+AM8RVu7VLnyv84db2Wkum+kacWdKsBfsrAHSW3fOzDsIAAABlBWzkcwAAAQDAEgw
+RgIhANYYrQA1wCVnfVkoLahKn4MNjBJOPUxtSBWB6JpMahWFAiEA+yc9Xxt+wAhI
+cykEbIo5naOPK1pM6f0me7/qt62Lb1UAdgBzICIPCBaK+fPEposKsmqaSgDu9XeF
+ighNBQDUpUJEWQAAAZQVs5HIAAAEAwBHMEUCIQCips8Q8ozMaQWBui1yDSlOBerU
+P+cvHDZk2LEKHNKn/gIgDJBoVE5Qqpf6+YvKJKPEqUlfJhS/Xafr/qSuCHVXrlEA
+dgDm0jFjQHeMwRBBBtdxuc7B0kD2loSG+7qHMh39HjeOUAAAAZQVs5HYAAAEAwBH
+MEUCIHS0PTGzJxyvRv5MU6PeRqXtO/wUAQrxBHR4iG6SPXJOAiEAnU6OrVWJZBpQ
+NTozJtUfR4VwaEcTqBSypt6nngZsjQMwDQYJKoZIhvcNAQELBQADggEBAHZ2FWJh
+3RsDUi21emVmqYvFdUdzDd3rj9E8xnL4DfyVeK/G6Z8DzamlG3TRw0PeDSTn0sPz
+dEp71UVtqKO2l5za+9w/mSdzh3nxqTQjUpIsnS+9ElcMsUsJzzSgOLosfPOd4Ht8
+14oDJezn/FdgdqSr8uWOMJXZcdLFZr19Hx/3Y1mbPb4jIptgbwhGU4Q32SgvpPqO
+RV+A/96g28XgvxsouYoaoaaw30OL8GuADyuj+1XXDA3hzVdF6g9nGAWS62qedeL1
+tycqNBlbgu5ZKSot74s84Pqz8A7x1V7AowtLv5Cjnij1l2T6B35zEbJtCaZ0v+NF
+wy91wnkOCbgMqkM=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
+MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE
+eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv
+NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch
+QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn
+NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP
+ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI
+lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf
+BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
+AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
+Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
+Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
+/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
+MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ
+L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi
+98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe
+xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN
+GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2
+n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEgjCCA2qgAwIBAgIQBEbB7LuEYrWpF3L5qhjmezANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0yMzA4MTUwMDAwMDBaFw0zMTExMDkyMzU5NTlaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo4IBNDCC
+ATAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUTiJUIBiV5uNu5g/6+rkS7QYX
+jzkwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD
+AgGGMHYGCCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
+aWNlcnQuY29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
+b20vRGlnaUNlcnRHbG9iYWxSb290Q0EuY3J0MEIGA1UdHwQ7MDkwN6A1oDOGMWh0
+dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmww
+EQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBCwUAA4IBAQCVDWYaZnQ4F6Sq
+Pvh0L4BW3CeDbvUrwuPypKgRvKk6RMY0hEN5CJKWtxXfQMF955d9k/7duBnEE8GM
+pa4hhYiuaj5aITNR65I8QwUsOUibwLzOjTpGE9T524+I5UgbmsIVrQxZrQnT5EmR
+3IDdtX+rJHASEgCTQeyEB3fR+Afiqtup45mJ502+lfLbLjJ/boMeQljP02L/JEL7
+k0WEihHGwa35Caz0z3CpFXf7FbJbcsQGl5QoySIPVXBWiDTw4Syf13zJy/uw4WO2
+gykqig+4k13VV8cppGXlzctCxvctARpBnwZgMO/OgssuDHNAsT2S9Q54bpJVC8OB
+QYzCl1hF
+-----END CERTIFICATE-----
diff --git a/sdk/server.key b/sdk/server.key
new file mode 100644
index 0000000..7ad1cdb
--- /dev/null
+++ b/sdk/server.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEA+D3zk7XYc7MMsfBnDZSedHbJyQtNdIKSpxYwODjux1Y6861b
+R+PonKyZufYtNJAfa0oiB87sCgQfv1adAQr6hvJ4OBYT8DrNSCQdmP0VXfKrmrTM
+g2q3yz5sWrccHeyk7YWKhplwiGoNLLOCWIXRY/htmfVqTN1vv1kJIoZBU51JvqlE
+BBSNcmiZq+5d7mDfOnq2uHsRcwBA3RWVtPry0IGFQAaxMTQ43iI8TfnFZxLsctOX
+1ecQ0/OSmBFGYmk8Oqy78kPQLJ6Wm3DW9YavjwjC6KwAM9Fy6fxHwRZOSpE1MKBn
+cv8MyKKBeC9ccGxco/GOXy1n93lXE9YTbPZcnQIDAQABAoIBADAICJ+dcUadr8ik
+G8Rwa6JcM5nfQnrXItoKfIT8WxMdt6Vbdwx3aBQcf1gQblm7wyCGxQPewSQE/UGP
+2CwR/DxtIN61QuFZ90tMlZ965I37fMGf1uxckzhTmTKKOHn/xj+g9ZcqjDAQ2QC7
+sO5A4i1mLYq7BfjeZZdP+mkAMhajuEkLM4KDj7UoX11YMCoKYUwVI2SimJy+OvfP
+MK98Zw4RQVD0mOXuKv45+UnF4hmm3ERTrv68tvZP1f5i0HdPFlpIMyc26tBmyNEN
+5d6e1aAVpv/KJsufeemtS565BzSu6lbmGVJPQPjwohTYEyoy4d5DsXjwDJqOSk0Y
+/Pl82N8CgYEA+hlSF+TGJZYvFnaZoLde+qBo8dkJ+6CqDzogOpyb08gvwkKqzUjp
+cPG9Wm43j0OKUZ00LBkKBGXpJkdBGGsrx+KIHdVpo6N1MMLbAF2OiQcCqT20Wl7t
+mLXYNT21ORwl2O3g83IE58W7vKsVgRGt0x5PqWUlfLIMroaDfiDSYhMCgYEA/hlq
+GRSIxrYeBoUYOVbQPiDegs+DZCVlMI5Af1mjnrHoDAwrP8OwZrU6zyoZaHfNFfXQ
+c8ERi29d/LWT6Osvu67U0Fp8eomiV7UPMVcpAwLnzkZvkMy9DznCWqVxvVtv7sCI
+jmRad9xmXp4eh8YwaLFMgKMmPcTv4FXHOxNanI8CgYALty/vSpo1nIlsJfYgXzal
+yunfmmkrTmVo/TIRTNDH5PLHyNOzdhzpW4mhONSFc4aBODn/btTXS+bWEjRsbmjI
+nkX+D8c5ESkmNZqIs9k/dgKb5vYR3ayHoM0WAWQB3t2vAcWt4cN1EAAxYFpLh4Z7
+A0p8Bu7wnm6Vplt2hxcT3QKBgQCMZpaNTR9WTQLCL4B3DlT6P0czmF3NVCxZbACP
+XYRfB4ZkQcUT8pjh53mbRnPLmYakf7Kygxeip+KS4/HaXTl+xteoWJc3Th15wP2o
+EbUDiPN0ss6qf7ZnV07gr1HtgzyR+6h4pVKnsAyQc2YDN6s/7deLrJpQvyScHEl9
+hvAmWQKBgBenqP/ZvrCbwJPEk5YeFMLPHSmx0kHaNwxR4LVy+UjtkHDm/aAuAH3C
+XXSe1rPQR51wvBSNVh7xzoyNZjrr/Gn1OImjnM7rZe9Nx/R6XMblhCPDrB8XYlBR
+J+h5P4B9g0wgizWgZ+w9lLLeFTZyYWjbTg44qIucp1ZMoU8WOfrd
+-----END RSA PRIVATE KEY-----
diff --git a/sdk/src/3rd/video-codec-lib/X264Encoder.js b/sdk/src/3rd/video-codec-lib/X264Encoder.js
index 2af68e8..6d2fb08 100644
--- a/sdk/src/3rd/video-codec-lib/X264Encoder.js
+++ b/sdk/src/3rd/video-codec-lib/X264Encoder.js
@@ -1,12 +1,12 @@
-var Module = (() => {
+var Module = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
return (
function(Module) {
Module = Module || {};
-var Module=typeof Module!="undefined"?Module:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var POINTER_SIZE=4;function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function uleb128Encode(n){if(n<128){return[n]}return[n%128|128,n>>7]}function sigToWasmTypes(sig){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="X264Encoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["memory"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["__indirect_function_table"];addOnInit(Module["asm"]["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}function setWasmTableEntry(idx,func){wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}var SYSCALLS={varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;return 0}function ___syscall_fstat64(fd,buf){}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;return 0}function ___syscall_lstat64(path,buf){}function ___syscall_newfstatat(dirfd,path,buf,flags){}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){}function ___syscall_stat64(path,buf){}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}return name}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return function(){"use strict";return body.apply(this,arguments)}}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i{if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options={}){if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb())}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationRegistry=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}var registeredPointers={};function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}var delayFunction=undefined;function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function attachFinalizer(handle){if("undefined"===typeof FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$)});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$:$$};finalizationRegistry.register(handle,info,handle)}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+embindRepr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAP32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}var rtn=getWasmTableEntry(ptr).apply(null,args);return rtn}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=0;Object.assign(argCache,arguments);return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return getWasmTableEntry(rawFunction)}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i>2])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=()=>{throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i{if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value},toHandle:value=>{switch(value){case undefined:return 1;case null:return 2;case true:return 3;case false:return 4;default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}};function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=Emval.toValue(handle);__emval_decref(handle);return rv},"toWireType":function(destructors,value){return Emval.toHandle(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function embindRepr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=value=>value;if(minRange===0){var bitshift=32-8*size;fromWireType=value=>value<>>bitshift}var isUnsignedType=name.includes("unsigned");var checkAssertions=(value,toTypeName)=>{};var toWireType;if(isUnsignedType){toWireType=function(destructors,value){checkAssertions(value,this.name);return value>>>0}}else{toWireType=function(destructors,value){checkAssertions(value,this.name);return value}}registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":toWireType,"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var payload=value+4;var str;if(stdStringIsUTF8){var decodeStartPtr=payload;for(var i=0;i<=length;++i){var currentBytePtr=payload+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+i]=charCode}}else{for(var i=0;iHEAPU16;shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=()=>HEAPU32;shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value=="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function _abort(){abort("")}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _fd_close(fd){return 52}function _fd_read(fd,iov,iovcnt,pnum){return 52}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){return 70}var printCharBuffers=[null,[],[]];function printChar(stream,curr){var buffer=printCharBuffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;for(var j=0;j>2]=num;return 0}function _h264_write_polyfill(){err("missing function: h264_write_polyfill");abort(-1)}function _setTempRet0(val){setTempRet0(val)}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_embind();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var ASSERTIONS=false;var asmLibraryArg={"__assert_fail":___assert_fail,"__syscall_fcntl64":___syscall_fcntl64,"__syscall_fstat64":___syscall_fstat64,"__syscall_ioctl":___syscall_ioctl,"__syscall_lstat64":___syscall_lstat64,"__syscall_newfstatat":___syscall_newfstatat,"__syscall_openat":___syscall_openat,"__syscall_renameat":___syscall_renameat,"__syscall_stat64":___syscall_stat64,"_embind_register_bigint":__embind_register_bigint,"_embind_register_bool":__embind_register_bool,"_embind_register_class":__embind_register_class,"_embind_register_class_constructor":__embind_register_class_constructor,"_embind_register_class_function":__embind_register_class_function,"_embind_register_emval":__embind_register_emval,"_embind_register_float":__embind_register_float,"_embind_register_integer":__embind_register_integer,"_embind_register_memory_view":__embind_register_memory_view,"_embind_register_std_string":__embind_register_std_string,"_embind_register_std_wstring":__embind_register_std_wstring,"_embind_register_void":__embind_register_void,"abort":_abort,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"fd_close":_fd_close,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"h264_write_polyfill":_h264_write_polyfill,"setTempRet0":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _h264_write=Module["_h264_write"]=function(){return(_h264_write=Module["_h264_write"]=Module["asm"]["h264_write"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["__getTypeName"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["__embind_register_native_and_builtin_types"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["dynCall_iij"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["dynCall_jii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
+var Module=typeof Module!=="undefined"?Module:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":318,"maximum":318+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0||i==maxBytesToRead/2)return str;++i;str+=String.fromCharCode(codeUnit)}}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=5775184,DYNAMIC_BASE=5775184,DYNAMICTOP_PTR=532144;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":2147483648/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";var wasmBinaryFile="X264Encoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;return 0}function ___sys_fstat64(fd,buf){}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;return 0}function ___sys_madvise1(addr,length,advice){return 0}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs}function ___sys_rename(old_path,new_path){}function ___sys_stat64(path,buf){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return function(){"use strict";return body.apply(this,arguments)}}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var argCache=[rawFunction];return function(){argCache.length=arguments.length+1;for(var i=0;i>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0||i==length){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(HEAP[currentBytePtr>>shift]==0||i==length){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function _abort(){abort()}function _emscripten_get_sbrk_ptr(){return 532144}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}var minHeapSize=16777216;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _fd_close(fd){return 0}function _fd_fdstat_get(fd,pbuf){var type=fd==1||fd==2?2:abort();HEAP8[pbuf>>0]=type;return 0}function _fd_read(fd,iov,iovcnt,pnum){var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}function _h264_write_polyfill(){err("missing function: h264_write_polyfill");abort(-1)}function _round(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _roundf(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _setTempRet0($i){setTempRet0($i|0)}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var ASSERTIONS=false;var asmLibraryArg={"__assert_fail":___assert_fail,"__sys_fcntl64":___sys_fcntl64,"__sys_fstat64":___sys_fstat64,"__sys_ioctl":___sys_ioctl,"__sys_madvise1":___sys_madvise1,"__sys_open":___sys_open,"__sys_rename":___sys_rename,"__sys_stat64":___sys_stat64,"_embind_register_bool":__embind_register_bool,"_embind_register_class":__embind_register_class,"_embind_register_class_constructor":__embind_register_class_constructor,"_embind_register_class_function":__embind_register_class_function,"_embind_register_emval":__embind_register_emval,"_embind_register_float":__embind_register_float,"_embind_register_integer":__embind_register_integer,"_embind_register_memory_view":__embind_register_memory_view,"_embind_register_std_string":__embind_register_std_string,"_embind_register_std_wstring":__embind_register_std_wstring,"_embind_register_void":__embind_register_void,"abort":_abort,"emscripten_get_sbrk_ptr":_emscripten_get_sbrk_ptr,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"fd_close":_fd_close,"fd_fdstat_get":_fd_fdstat_get,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"h264_write_polyfill":_h264_write_polyfill,"memory":wasmMemory,"round":_round,"roundf":_roundf,"setTempRet0":_setTempRet0,"table":wasmTable};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _h264_write=Module["_h264_write"]=function(){return(_h264_write=Module["_h264_write"]=Module["asm"]["h264_write"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["__getTypeName"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["__embind_register_native_and_builtin_types"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var __growWasmMemory=Module["__growWasmMemory"]=function(){return(__growWasmMemory=Module["__growWasmMemory"]=Module["asm"]["__growWasmMemory"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["dynCall_ii"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["dynCall_vi"]).apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return(dynCall_i=Module["dynCall_i"]=Module["asm"]["dynCall_i"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["dynCall_iiii"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["dynCall_iiiii"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["dynCall_iii"]).apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return(dynCall_viiii=Module["dynCall_viiii"]=Module["asm"]["dynCall_viiii"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["dynCall_iij"]).apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return(dynCall_iiiiii=Module["dynCall_iiiiii"]=Module["asm"]["dynCall_iiiiii"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["dynCall_vii"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["dynCall_viii"]).apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return(dynCall_viiiii=Module["dynCall_viiiii"]=Module["asm"]["dynCall_viiiii"]).apply(null,arguments)};var dynCall_viiiiii=Module["dynCall_viiiiii"]=function(){return(dynCall_viiiiii=Module["dynCall_viiiiii"]=Module["asm"]["dynCall_viiiiii"]).apply(null,arguments)};var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=function(){return(dynCall_viiiiiii=Module["dynCall_viiiiiii"]=Module["asm"]["dynCall_viiiiiii"]).apply(null,arguments)};var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=function(){return(dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=Module["asm"]["dynCall_iiiiiiii"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["dynCall_jii"]).apply(null,arguments)};var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=function(){return(dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=Module["asm"]["dynCall_viiiiiiii"]).apply(null,arguments)};var dynCall_fiii=Module["dynCall_fiii"]=function(){return(dynCall_fiii=Module["dynCall_fiii"]=Module["asm"]["dynCall_fiii"]).apply(null,arguments)};var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=function(){return(dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=Module["asm"]["dynCall_viiiiiiiii"]).apply(null,arguments)};var dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=function(){return(dynCall_iiiiiiiiii=Module["dynCall_iiiiiiiiii"]=Module["asm"]["dynCall_iiiiiiiiii"]).apply(null,arguments)};var dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=function(){return(dynCall_viiiiiiiiiii=Module["dynCall_viiiiiiiiiii"]=Module["asm"]["dynCall_viiiiiiiiiii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["dynCall_iidiiii"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run();
return Module.ready
diff --git a/sdk/src/3rd/video-codec-lib/X264Encoder.wasm b/sdk/src/3rd/video-codec-lib/X264Encoder.wasm
index 466e9c0af9ce5f51c30f553af7d198beaccba281..394363b4d7d22959b5f959cad9a0b8ed9e4d3ea8 100644
GIT binary patch
literal 668234
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