@leafer-in/video 0.0.0-stage → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1 -3
- package/dist/video.cjs +313 -0
- package/dist/video.esm.js +305 -0
- package/dist/video.esm.min.js +2 -0
- package/dist/video.esm.min.js.map +1 -0
- package/dist/video.js +293 -0
- package/dist/video.min.cjs +2 -0
- package/dist/video.min.cjs.map +1 -0
- package/dist/video.min.js +2 -0
- package/dist/video.min.js.map +1 -0
- package/package.json +38 -3
- package/src/PaintVideo.ts +88 -0
- package/src/Video.ts +40 -0
- package/src/VideoDecoder.ts +118 -0
- package/src/data/VideoData.ts +9 -0
- package/src/index.ts +130 -0
- package/src/interface/IVideo.ts +12 -0
- package/types/index.d.ts +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.esm.min.js","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/video/src/VideoDecoder.ts","../../../../../../src/in/packages/video/src/data/VideoData.ts","../../../../../../src/in/packages/video/src/PaintVideo.ts","../../../../../../src/in/packages/video/src/Video.ts","../../../../../../src/in/packages/video/src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { MathHelper } from '@leafer-ui/draw'\nimport { ICanvasContext2D, IVideoDecoder, IVideoFileType, ILeaf, IVideoPlayOptions } from '@leafer-ui/interface'\n\n\ninterface IVideoDecoderMap {\n [name: string]: { Decoder: any, force?: boolean }\n}\n\nexport class VideoDecoder implements IVideoDecoder {\n\n public width: number // 宽度\n public height: number // 高度\n\n public duration: number\n\n public get currentTime(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video.currentTime\n }\n\n public set currentTime(time: number) { // 设置播放进度\n const video = this.decoder\n const targetTime = MathHelper.within(time, 0, this.duration)\n video.currentTime = targetTime\n }\n\n public get volume(): number { // 获取当前音量 (0 ~ 1)\n const video = this.decoder\n return video.volume\n }\n\n public set volume(volume: number) { // 设置音量 (0 ~ 1)\n const video = this.decoder\n const targetVolume = MathHelper.within(volume, 0, 1)\n video.volume = targetVolume\n if (targetVolume > 0 && video.muted) video.muted = false // 如果音量大于 0,确保解除静音状态\n }\n\n public get paused(): boolean {\n const video = this.decoder\n return video.paused\n }\n\n public get ended(): boolean {\n const video = this.decoder\n return video.ended\n }\n\n public loop: number // 循环次数,为0表示无限循环\n\n public decoder: HTMLVideoElement // 解码器\n\n // 缓冲画布\n public bufferCanvas?: any\n public bufferContext?: ICanvasContext2D\n\n static decoderMap: IVideoDecoderMap = {}\n\n static register(type: IVideoFileType, Decoder: any, force?: boolean): void {\n VideoDecoder.decoderMap[type] = { Decoder, force }\n }\n\n public load(): Promise<void> {\n return undefined\n }\n\n public play(): void {\n const video = this.decoder\n video.play()\n }\n\n public pause(): void {\n const video = this.decoder\n video.pause()\n }\n\n\n public render(canvas: ICanvasContext2D, x: number, y: number, width: number, height: number, leaf: ILeaf, playOptions: IVideoPlayOptions, _imageScaleX: number, _imageScaleY: number): void {\n let { paused } = playOptions\n\n const video = this.decoder\n if (video.ended) {\n video.pause()\n playOptions.paused = true\n playOptions.loop = (playOptions.loop as number || 0) + 1\n }\n\n if (paused === false && video.paused) {\n this.play()\n } else if (paused === true && !video.paused) {\n this.pause()\n } else {\n playOptions.paused = video.paused\n }\n\n // 仅在视频处于播放状态,且有实际数据更新时进行绘制\n canvas.drawImage(video, x, y, width, height)\n\n if (!video.paused) leaf.forceRender() // 防止停掉\n }\n\n\n public destroyDecoder(): void {\n const video = this.decoder\n if (video) {\n\n video.pause()\n video.src = ''\n video.load()\n this.decoder = null\n }\n }\n\n public close(): void {\n this.destroyDecoder()\n }\n\n}\n","import { IMultimediaType } from '@leafer-ui/interface'\nimport { ImageData } from '@leafer-ui/draw'\n\n\nexport class VideoData extends ImageData {\n\n public get __urlType(): IMultimediaType { return 'video' }\n\n}","import { ILeafPaint, IVideoDecoder, IUI } from '@leafer-ui/interface'\nimport { isArray } from '@leafer-ui/draw'\n\nexport class PaintVideo {\n\n public element: IUI\n\n public get playerOptions(): ILeafPaint { const { fill } = (this.element || this as any).__; return isArray(fill) && fill.find(item => item.type === 'video') }\n\n public get decoder(): IVideoDecoder { const { playerOptions } = this; return playerOptions && playerOptions.image && playerOptions.image.view }\n\n public get duration(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video && video.duration\n }\n\n public get currentTime(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video && video.currentTime\n }\n\n public set currentTime(time: number) { // 设置播放进度\n const video = this.decoder\n if (video) {\n video.currentTime = time\n video.decoder.addEventListener('seeked', () => (this.element || this as any as IUI).forceRender(), { once: true }) // 需要强制更新一下元素\n }\n }\n\n public get volume(): number { // 获取当前音量 (0 ~ 1)\n const video = this.decoder\n return video && video.volume\n }\n\n public set volume(volume: number) { // 设置音量 (0 ~ 1)\n const video = this.decoder\n if (video) video.volume = volume\n }\n\n public get paused(): boolean {\n const video = this.decoder\n return video && video.paused\n }\n\n public get ended(): boolean {\n const video = this.decoder\n return video && video.ended\n }\n\n\n constructor(element: IUI) {\n this.element = element\n }\n\n\n public togglePlay(): void {\n const { playerOptions } = this\n if (playerOptions) {\n if (playerOptions.paused !== false) this.play()\n else this.pause()\n }\n }\n\n public play(): void {\n const { playerOptions } = this\n if (playerOptions && playerOptions.paused !== false) {\n playerOptions.paused = false;\n (this.element || this as any as IUI).forceRender()\n }\n }\n\n public pause(): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.paused = true\n this.decoder.pause()\n }\n }\n\n public stop(): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.nowIndex = 0\n this.currentTime = 0\n this.pause()\n }\n }\n}\n","import { IVideo, IVideoInputData, IVideoData, IVideoDecoder, ILeafPaint } from '@leafer-ui/interface'\nimport { Image, registerUI, dataProcessor, useModule } from '@leafer-ui/draw'\n\nimport { VideoData } from './data/VideoData'\nimport { PaintVideo } from './PaintVideo'\n\n\n@useModule(PaintVideo)\n@registerUI()\nexport class Video<TInputData = IVideoInputData> extends Image<TInputData> implements IVideo {\n\n public get __tag() { return 'Video' }\n\n @dataProcessor(VideoData)\n declare public __: IVideoData\n\n public autoplay?: boolean\n\n public muted?: boolean\n\n public loop?: boolean\n}\n\nexport interface Video {\n\n readonly playerOptions: ILeafPaint\n readonly decoder: IVideoDecoder\n\n duration: number // 总时长\n currentTime: number // 当前播放进度 (秒)\n volume: number // 音量 0 ~1 \n\n readonly paused: boolean\n readonly ended: boolean // 是否播放结束\n\n togglePlay(): void\n play(): void\n pause(): void\n stop(): void\n}","import { LeaferVideo, Platform, Creator, PaintImage, Resource, Plugin, isObject } from '@leafer-ui/draw'\nimport { ILeaferVideo, ILeaferVideoConfig, IImageCrossOrigin, ILeaf, ILeafPaint, IVideoFileType } from '@leafer-ui/interface'\n\nimport { VideoDecoder } from './VideoDecoder'\n\nexport { Video } from './Video'\nexport { VideoData } from './data/VideoData'\nexport { VideoDecoder } from './VideoDecoder'\nexport { PaintVideo } from './PaintVideo'\n\n\nPlugin.add('video')\n\n\nPaintImage.video = function (paint: ILeafPaint, oldPaint?: ILeafPaint): void {\n paint.film = true\n paint.nowIndex = 0\n if (isObject(oldPaint)) {\n paint.paused = oldPaint.paused\n paint.loop = oldPaint.loop\n }\n}\n\nCreator.video = function (options?: ILeaferVideoConfig): ILeaferVideo {\n return new LeaferVideo(options)\n}\n\nResource.loadVideo = function (key: string, format?: IVideoFileType): Promise<ILeaferVideo> {\n return new Promise((resolve, reject) => {\n const config: ILeaferVideoConfig = { url: key }\n if (format) config.format = format\n const video = Creator.video(config)\n Resource.set(key, video)\n video.load(() => resolve(video), (e: any) => reject(e))\n })\n}\n\nLeaferVideo.prototype.render = function (canvas: any, x: number, y: number, width: number, height: number, leaf: ILeaf, paint: any, imageScaleX: number, imageScaleY: number): void {\n this.view.render(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY)\n}\n\n\nPlatform.origin.loadVideo = async function (url: string, _crossOrigin?: IImageCrossOrigin, _leaferVideo?: ILeaferVideo): Promise<any> {\n //const buffer = await Platform.origin.loadContent(url, 'arrayBuffer')\n\n // let ext = getFileExt(url) // 获取文件后缀名\n\n // if (!ext) {\n // if (leaferVideo) ext = leaferVideo.config.format\n // if (!ext) ext = 'gif'\n // }\n\n // const mimeType = FileHelper.mimeType(ext)\n const video = createVideoElement(url)\n\n const decoder = new VideoDecoder()\n\n const { width, height, duration } = await waitVideoMetadata(video)\n decoder.decoder = video\n decoder.width = width\n decoder.height = height\n decoder.duration = duration\n\n await waitVideoFrameReady(video)\n\n return decoder\n}\n\n/**\n * 创建并配置一个隐藏的 HTMLVideoElement\n */\nfunction createVideoElement(url: string, muted = false, loop = false): HTMLVideoElement {\n const video = document.createElement('video')\n video.src = url\n video.muted = muted\n video.loop = loop\n\n // 必须设置 playsInline 保证在移动端浏览器内联播放,而不是弹窗全屏\n video.playsInline = true\n //video.webkitPlaysInline = true\n\n // 允许跨域(如果视频托管在 CDN,Canvas 绘制需要此属性避免 Canvas 污染/报错)\n video.crossOrigin = 'anonymous'\n\n return video\n}\n\n/**\n * 等待视频元数据加载完毕,返回视频的尺寸与时长信息\n */\nfunction waitVideoMetadata(video: HTMLVideoElement): Promise<{ width: number; height: number; duration: number }> {\n return new Promise((resolve) => {\n if (video.readyState >= 1) { // HAVE_METADATA 及以上\n resolve({\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n })\n } else {\n video.addEventListener('loadedmetadata', () => {\n resolve({\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n })\n }, { once: true })\n }\n })\n}\n\n/**\n * 等待视频首帧可绘制到 Canvas\n */\nexport function waitVideoFrameReady(video: HTMLVideoElement): Promise<void> {\n return new Promise((resolve) => {\n if ('requestVideoFrameCallback' in video) {\n video.requestVideoFrameCallback(() => resolve())\n return\n }\n\n if ((video as any).readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n resolve()\n return\n }\n\n (video as any).addEventListener('loadeddata', () => resolve(), {\n once: true\n })\n })\n}"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","SuppressedError","VideoDecoder","currentTime","this","decoder","time","video","targetTime","MathHelper","within","duration","volume","targetVolume","muted","paused","ended","register","type","Decoder","force","decoderMap","load","play","pause","render","canvas","x","y","width","height","leaf","playOptions","_imageScaleX","_imageScaleY","loop","drawImage","forceRender","destroyDecoder","src","close","VideoData","ImageData","__urlType","PaintVideo","playerOptions","fill","element","__","isArray","find","item","image","view","addEventListener","once","constructor","togglePlay","stop","nowIndex","Video","Image","__tag","waitVideoFrameReady","requestVideoFrameCallback","readyState","HTMLMediaElement","HAVE_CURRENT_DATA","dataProcessor","prototype","useModule","registerUI","Plugin","add","PaintImage","paint","oldPaint","film","isObject","Creator","options","LeaferVideo","Resource","loadVideo","format","config","url","set","imageScaleX","imageScaleY","Platform","origin","_crossOrigin","_leaferVideo","document","createElement","playsInline","crossOrigin","createVideoElement","videoWidth","videoHeight","waitVideoMetadata"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/video.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
this.LeaferIN = this.LeaferIN || {};
|
|
2
|
+
|
|
3
|
+
this.LeaferIN.video = function(exports, draw) {
|
|
4
|
+
"use strict";
|
|
5
|
+
function __decorate(decorators, target, key, desc) {
|
|
6
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
7
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
}
|
|
10
|
+
function __awaiter(thisArg, _arguments, P, generator) {
|
|
11
|
+
function adopt(value) {
|
|
12
|
+
return value instanceof P ? value : new P(function(resolve) {
|
|
13
|
+
resolve(value);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return new (P || (P = Promise))(function(resolve, reject) {
|
|
17
|
+
function fulfilled(value) {
|
|
18
|
+
try {
|
|
19
|
+
step(generator.next(value));
|
|
20
|
+
} catch (e) {
|
|
21
|
+
reject(e);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function rejected(value) {
|
|
25
|
+
try {
|
|
26
|
+
step(generator["throw"](value));
|
|
27
|
+
} catch (e) {
|
|
28
|
+
reject(e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function step(result) {
|
|
32
|
+
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
33
|
+
}
|
|
34
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
38
|
+
var e = new Error(message);
|
|
39
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
40
|
+
};
|
|
41
|
+
class VideoDecoder {
|
|
42
|
+
get currentTime() {
|
|
43
|
+
const video = this.decoder;
|
|
44
|
+
return video.currentTime;
|
|
45
|
+
}
|
|
46
|
+
set currentTime(time) {
|
|
47
|
+
const video = this.decoder;
|
|
48
|
+
const targetTime = draw.MathHelper.within(time, 0, this.duration);
|
|
49
|
+
video.currentTime = targetTime;
|
|
50
|
+
}
|
|
51
|
+
get volume() {
|
|
52
|
+
const video = this.decoder;
|
|
53
|
+
return video.volume;
|
|
54
|
+
}
|
|
55
|
+
set volume(volume) {
|
|
56
|
+
const video = this.decoder;
|
|
57
|
+
const targetVolume = draw.MathHelper.within(volume, 0, 1);
|
|
58
|
+
video.volume = targetVolume;
|
|
59
|
+
if (targetVolume > 0 && video.muted) video.muted = false;
|
|
60
|
+
}
|
|
61
|
+
get paused() {
|
|
62
|
+
const video = this.decoder;
|
|
63
|
+
return video.paused;
|
|
64
|
+
}
|
|
65
|
+
get ended() {
|
|
66
|
+
const video = this.decoder;
|
|
67
|
+
return video.ended;
|
|
68
|
+
}
|
|
69
|
+
static register(type, Decoder, force) {
|
|
70
|
+
VideoDecoder.decoderMap[type] = {
|
|
71
|
+
Decoder: Decoder,
|
|
72
|
+
force: force
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
load() {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
play() {
|
|
79
|
+
const video = this.decoder;
|
|
80
|
+
video.play();
|
|
81
|
+
}
|
|
82
|
+
pause() {
|
|
83
|
+
const video = this.decoder;
|
|
84
|
+
video.pause();
|
|
85
|
+
}
|
|
86
|
+
render(canvas, x, y, width, height, leaf, playOptions, _imageScaleX, _imageScaleY) {
|
|
87
|
+
let {paused: paused} = playOptions;
|
|
88
|
+
const video = this.decoder;
|
|
89
|
+
if (video.ended) {
|
|
90
|
+
video.pause();
|
|
91
|
+
playOptions.paused = true;
|
|
92
|
+
playOptions.loop = (playOptions.loop || 0) + 1;
|
|
93
|
+
}
|
|
94
|
+
if (paused === false && video.paused) {
|
|
95
|
+
this.play();
|
|
96
|
+
} else if (paused === true && !video.paused) {
|
|
97
|
+
this.pause();
|
|
98
|
+
} else {
|
|
99
|
+
playOptions.paused = video.paused;
|
|
100
|
+
}
|
|
101
|
+
canvas.drawImage(video, x, y, width, height);
|
|
102
|
+
if (!video.paused) leaf.forceRender();
|
|
103
|
+
}
|
|
104
|
+
destroyDecoder() {
|
|
105
|
+
const video = this.decoder;
|
|
106
|
+
if (video) {
|
|
107
|
+
video.pause();
|
|
108
|
+
video.src = "";
|
|
109
|
+
video.load();
|
|
110
|
+
this.decoder = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
close() {
|
|
114
|
+
this.destroyDecoder();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
VideoDecoder.decoderMap = {};
|
|
118
|
+
class VideoData extends draw.ImageData {
|
|
119
|
+
get __urlType() {
|
|
120
|
+
return "video";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
class PaintVideo {
|
|
124
|
+
get playerOptions() {
|
|
125
|
+
const {fill: fill} = (this.element || this).__;
|
|
126
|
+
return draw.isArray(fill) && fill.find(item => item.type === "video");
|
|
127
|
+
}
|
|
128
|
+
get decoder() {
|
|
129
|
+
const {playerOptions: playerOptions} = this;
|
|
130
|
+
return playerOptions && playerOptions.image && playerOptions.image.view;
|
|
131
|
+
}
|
|
132
|
+
get duration() {
|
|
133
|
+
const video = this.decoder;
|
|
134
|
+
return video && video.duration;
|
|
135
|
+
}
|
|
136
|
+
get currentTime() {
|
|
137
|
+
const video = this.decoder;
|
|
138
|
+
return video && video.currentTime;
|
|
139
|
+
}
|
|
140
|
+
set currentTime(time) {
|
|
141
|
+
const video = this.decoder;
|
|
142
|
+
if (video) {
|
|
143
|
+
video.currentTime = time;
|
|
144
|
+
video.decoder.addEventListener("seeked", () => (this.element || this).forceRender(), {
|
|
145
|
+
once: true
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
get volume() {
|
|
150
|
+
const video = this.decoder;
|
|
151
|
+
return video && video.volume;
|
|
152
|
+
}
|
|
153
|
+
set volume(volume) {
|
|
154
|
+
const video = this.decoder;
|
|
155
|
+
if (video) video.volume = volume;
|
|
156
|
+
}
|
|
157
|
+
get paused() {
|
|
158
|
+
const video = this.decoder;
|
|
159
|
+
return video && video.paused;
|
|
160
|
+
}
|
|
161
|
+
get ended() {
|
|
162
|
+
const video = this.decoder;
|
|
163
|
+
return video && video.ended;
|
|
164
|
+
}
|
|
165
|
+
constructor(element) {
|
|
166
|
+
this.element = element;
|
|
167
|
+
}
|
|
168
|
+
togglePlay() {
|
|
169
|
+
const {playerOptions: playerOptions} = this;
|
|
170
|
+
if (playerOptions) {
|
|
171
|
+
if (playerOptions.paused !== false) this.play(); else this.pause();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
play() {
|
|
175
|
+
const {playerOptions: playerOptions} = this;
|
|
176
|
+
if (playerOptions && playerOptions.paused !== false) {
|
|
177
|
+
playerOptions.paused = false;
|
|
178
|
+
(this.element || this).forceRender();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
pause() {
|
|
182
|
+
const {playerOptions: playerOptions} = this;
|
|
183
|
+
if (playerOptions) {
|
|
184
|
+
playerOptions.paused = true;
|
|
185
|
+
this.decoder.pause();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
stop() {
|
|
189
|
+
const {playerOptions: playerOptions} = this;
|
|
190
|
+
if (playerOptions) {
|
|
191
|
+
playerOptions.nowIndex = 0;
|
|
192
|
+
this.currentTime = 0;
|
|
193
|
+
this.pause();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.Video = class Video extends draw.Image {
|
|
198
|
+
get __tag() {
|
|
199
|
+
return "Video";
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
__decorate([ draw.dataProcessor(VideoData) ], exports.Video.prototype, "__", void 0);
|
|
203
|
+
exports.Video = __decorate([ draw.useModule(PaintVideo), draw.registerUI() ], exports.Video);
|
|
204
|
+
draw.Plugin.add("video");
|
|
205
|
+
draw.PaintImage.video = function(paint, oldPaint) {
|
|
206
|
+
paint.film = true;
|
|
207
|
+
paint.nowIndex = 0;
|
|
208
|
+
if (draw.isObject(oldPaint)) {
|
|
209
|
+
paint.paused = oldPaint.paused;
|
|
210
|
+
paint.loop = oldPaint.loop;
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
draw.Creator.video = function(options) {
|
|
214
|
+
return new draw.LeaferVideo(options);
|
|
215
|
+
};
|
|
216
|
+
draw.Resource.loadVideo = function(key, format) {
|
|
217
|
+
return new Promise((resolve, reject) => {
|
|
218
|
+
const config = {
|
|
219
|
+
url: key
|
|
220
|
+
};
|
|
221
|
+
if (format) config.format = format;
|
|
222
|
+
const video = draw.Creator.video(config);
|
|
223
|
+
draw.Resource.set(key, video);
|
|
224
|
+
video.load(() => resolve(video), e => reject(e));
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
draw.LeaferVideo.prototype.render = function(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY) {
|
|
228
|
+
this.view.render(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY);
|
|
229
|
+
};
|
|
230
|
+
draw.Platform.origin.loadVideo = function(url, _crossOrigin, _leaferVideo) {
|
|
231
|
+
return __awaiter(this, void 0, void 0, function*() {
|
|
232
|
+
const video = createVideoElement(url);
|
|
233
|
+
const decoder = new VideoDecoder;
|
|
234
|
+
const {width: width, height: height, duration: duration} = yield waitVideoMetadata(video);
|
|
235
|
+
decoder.decoder = video;
|
|
236
|
+
decoder.width = width;
|
|
237
|
+
decoder.height = height;
|
|
238
|
+
decoder.duration = duration;
|
|
239
|
+
yield waitVideoFrameReady(video);
|
|
240
|
+
return decoder;
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
function createVideoElement(url, muted = false, loop = false) {
|
|
244
|
+
const video = document.createElement("video");
|
|
245
|
+
video.src = url;
|
|
246
|
+
video.muted = muted;
|
|
247
|
+
video.loop = loop;
|
|
248
|
+
video.playsInline = true;
|
|
249
|
+
video.crossOrigin = "anonymous";
|
|
250
|
+
return video;
|
|
251
|
+
}
|
|
252
|
+
function waitVideoMetadata(video) {
|
|
253
|
+
return new Promise(resolve => {
|
|
254
|
+
if (video.readyState >= 1) {
|
|
255
|
+
resolve({
|
|
256
|
+
width: video.videoWidth,
|
|
257
|
+
height: video.videoHeight,
|
|
258
|
+
duration: video.duration
|
|
259
|
+
});
|
|
260
|
+
} else {
|
|
261
|
+
video.addEventListener("loadedmetadata", () => {
|
|
262
|
+
resolve({
|
|
263
|
+
width: video.videoWidth,
|
|
264
|
+
height: video.videoHeight,
|
|
265
|
+
duration: video.duration
|
|
266
|
+
});
|
|
267
|
+
}, {
|
|
268
|
+
once: true
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
function waitVideoFrameReady(video) {
|
|
274
|
+
return new Promise(resolve => {
|
|
275
|
+
if ("requestVideoFrameCallback" in video) {
|
|
276
|
+
video.requestVideoFrameCallback(() => resolve());
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {
|
|
280
|
+
resolve();
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
video.addEventListener("loadeddata", () => resolve(), {
|
|
284
|
+
once: true
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
exports.PaintVideo = PaintVideo;
|
|
289
|
+
exports.VideoData = VideoData;
|
|
290
|
+
exports.VideoDecoder = VideoDecoder;
|
|
291
|
+
exports.waitVideoFrameReady = waitVideoFrameReady;
|
|
292
|
+
return exports;
|
|
293
|
+
}({}, LeaferUI);
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("@leafer-ui/draw");function t(e,t,r,o){var d,n=arguments.length,i=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,o);else for(var s=e.length-1;s>=0;s--)(d=e[s])&&(i=(n<3?d(i):n>3?d(t,r,i):d(t,r))||i);return n>3&&i&&Object.defineProperty(t,r,i),i}function r(e,t,r,o){return new(r||(r=Promise))(function(d,n){function i(e){try{a(o.next(e))}catch(e){n(e)}}function s(e){try{a(o.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(i,s)}a((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class o{get currentTime(){return this.decoder.currentTime}set currentTime(t){const r=this.decoder,o=e.MathHelper.within(t,0,this.duration);r.currentTime=o}get volume(){return this.decoder.volume}set volume(t){const r=this.decoder,o=e.MathHelper.within(t,0,1);r.volume=o,o>0&&r.muted&&(r.muted=!1)}get paused(){return this.decoder.paused}get ended(){return this.decoder.ended}static register(e,t,r){o.decoderMap[e]={Decoder:t,force:r}}load(){}play(){this.decoder.play()}pause(){this.decoder.pause()}render(e,t,r,o,d,n,i,s,a){let{paused:c}=i;const u=this.decoder;u.ended&&(u.pause(),i.paused=!0,i.loop=(i.loop||0)+1),!1===c&&u.paused?this.play():!0!==c||u.paused?i.paused=u.paused:this.pause(),e.drawImage(u,t,r,o,d),u.paused||n.forceRender()}destroyDecoder(){const e=this.decoder;e&&(e.pause(),e.src="",e.load(),this.decoder=null)}close(){this.destroyDecoder()}}o.decoderMap={};class d extends e.ImageData{get __urlType(){return"video"}}class n{get playerOptions(){const{fill:t}=(this.element||this).__;return e.isArray(t)&&t.find(e=>"video"===e.type)}get decoder(){const{playerOptions:e}=this;return e&&e.image&&e.image.view}get duration(){const e=this.decoder;return e&&e.duration}get currentTime(){const e=this.decoder;return e&&e.currentTime}set currentTime(e){const t=this.decoder;t&&(t.currentTime=e,t.decoder.addEventListener("seeked",()=>(this.element||this).forceRender(),{once:!0}))}get volume(){const e=this.decoder;return e&&e.volume}set volume(e){const t=this.decoder;t&&(t.volume=e)}get paused(){const e=this.decoder;return e&&e.paused}get ended(){const e=this.decoder;return e&&e.ended}constructor(e){this.element=e}togglePlay(){const{playerOptions:e}=this;e&&(!1!==e.paused?this.play():this.pause())}play(){const{playerOptions:e}=this;e&&!1!==e.paused&&(e.paused=!1,(this.element||this).forceRender())}pause(){const{playerOptions:e}=this;e&&(e.paused=!0,this.decoder.pause())}stop(){const{playerOptions:e}=this;e&&(e.nowIndex=0,this.currentTime=0,this.pause())}}function i(e){return new Promise(t=>{"requestVideoFrameCallback"in e?e.requestVideoFrameCallback(()=>t()):e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA?t():e.addEventListener("loadeddata",()=>t(),{once:!0})})}exports.Video=class extends e.Image{get __tag(){return"Video"}},t([e.dataProcessor(d)],exports.Video.prototype,"__",void 0),exports.Video=t([e.useModule(n),e.registerUI()],exports.Video),e.Plugin.add("video"),e.PaintImage.video=function(t,r){t.film=!0,t.nowIndex=0,e.isObject(r)&&(t.paused=r.paused,t.loop=r.loop)},e.Creator.video=function(t){return new e.LeaferVideo(t)},e.Resource.loadVideo=function(t,r){return new Promise((o,d)=>{const n={url:t};r&&(n.format=r);const i=e.Creator.video(n);e.Resource.set(t,i),i.load(()=>o(i),e=>d(e))})},e.LeaferVideo.prototype.render=function(e,t,r,o,d,n,i,s,a){this.view.render(e,t,r,o,d,n,i,s,a)},e.Platform.origin.loadVideo=function(e,t,d){return r(this,void 0,void 0,function*(){const t=function(e,t=!1,r=!1){const o=document.createElement("video");return o.src=e,o.muted=t,o.loop=r,o.playsInline=!0,o.crossOrigin="anonymous",o}(e),r=new o,{width:d,height:n,duration:s}=yield function(e){return new Promise(t=>{e.readyState>=1?t({width:e.videoWidth,height:e.videoHeight,duration:e.duration}):e.addEventListener("loadedmetadata",()=>{t({width:e.videoWidth,height:e.videoHeight,duration:e.duration})},{once:!0})})}(t);return r.decoder=t,r.width=d,r.height=n,r.duration=s,yield i(t),r})},exports.PaintVideo=n,exports.VideoData=d,exports.VideoDecoder=o,exports.waitVideoFrameReady=i;
|
|
2
|
+
//# sourceMappingURL=video.min.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.min.cjs","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/video/src/VideoDecoder.ts","../../../../../../src/in/packages/video/src/data/VideoData.ts","../../../../../../src/in/packages/video/src/PaintVideo.ts","../../../../../../src/in/packages/video/src/index.ts","../../../../../../src/in/packages/video/src/Video.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { MathHelper } from '@leafer-ui/draw'\nimport { ICanvasContext2D, IVideoDecoder, IVideoFileType, ILeaf, IVideoPlayOptions } from '@leafer-ui/interface'\n\n\ninterface IVideoDecoderMap {\n [name: string]: { Decoder: any, force?: boolean }\n}\n\nexport class VideoDecoder implements IVideoDecoder {\n\n public width: number // 宽度\n public height: number // 高度\n\n public duration: number\n\n public get currentTime(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video.currentTime\n }\n\n public set currentTime(time: number) { // 设置播放进度\n const video = this.decoder\n const targetTime = MathHelper.within(time, 0, this.duration)\n video.currentTime = targetTime\n }\n\n public get volume(): number { // 获取当前音量 (0 ~ 1)\n const video = this.decoder\n return video.volume\n }\n\n public set volume(volume: number) { // 设置音量 (0 ~ 1)\n const video = this.decoder\n const targetVolume = MathHelper.within(volume, 0, 1)\n video.volume = targetVolume\n if (targetVolume > 0 && video.muted) video.muted = false // 如果音量大于 0,确保解除静音状态\n }\n\n public get paused(): boolean {\n const video = this.decoder\n return video.paused\n }\n\n public get ended(): boolean {\n const video = this.decoder\n return video.ended\n }\n\n public loop: number // 循环次数,为0表示无限循环\n\n public decoder: HTMLVideoElement // 解码器\n\n // 缓冲画布\n public bufferCanvas?: any\n public bufferContext?: ICanvasContext2D\n\n static decoderMap: IVideoDecoderMap = {}\n\n static register(type: IVideoFileType, Decoder: any, force?: boolean): void {\n VideoDecoder.decoderMap[type] = { Decoder, force }\n }\n\n public load(): Promise<void> {\n return undefined\n }\n\n public play(): void {\n const video = this.decoder\n video.play()\n }\n\n public pause(): void {\n const video = this.decoder\n video.pause()\n }\n\n\n public render(canvas: ICanvasContext2D, x: number, y: number, width: number, height: number, leaf: ILeaf, playOptions: IVideoPlayOptions, _imageScaleX: number, _imageScaleY: number): void {\n let { paused } = playOptions\n\n const video = this.decoder\n if (video.ended) {\n video.pause()\n playOptions.paused = true\n playOptions.loop = (playOptions.loop as number || 0) + 1\n }\n\n if (paused === false && video.paused) {\n this.play()\n } else if (paused === true && !video.paused) {\n this.pause()\n } else {\n playOptions.paused = video.paused\n }\n\n // 仅在视频处于播放状态,且有实际数据更新时进行绘制\n canvas.drawImage(video, x, y, width, height)\n\n if (!video.paused) leaf.forceRender() // 防止停掉\n }\n\n\n public destroyDecoder(): void {\n const video = this.decoder\n if (video) {\n\n video.pause()\n video.src = ''\n video.load()\n this.decoder = null\n }\n }\n\n public close(): void {\n this.destroyDecoder()\n }\n\n}\n","import { IMultimediaType } from '@leafer-ui/interface'\nimport { ImageData } from '@leafer-ui/draw'\n\n\nexport class VideoData extends ImageData {\n\n public get __urlType(): IMultimediaType { return 'video' }\n\n}","import { ILeafPaint, IVideoDecoder, IUI } from '@leafer-ui/interface'\nimport { isArray } from '@leafer-ui/draw'\n\nexport class PaintVideo {\n\n public element: IUI\n\n public get playerOptions(): ILeafPaint { const { fill } = (this.element || this as any).__; return isArray(fill) && fill.find(item => item.type === 'video') }\n\n public get decoder(): IVideoDecoder { const { playerOptions } = this; return playerOptions && playerOptions.image && playerOptions.image.view }\n\n public get duration(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video && video.duration\n }\n\n public get currentTime(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video && video.currentTime\n }\n\n public set currentTime(time: number) { // 设置播放进度\n const video = this.decoder\n if (video) {\n video.currentTime = time\n video.decoder.addEventListener('seeked', () => (this.element || this as any as IUI).forceRender(), { once: true }) // 需要强制更新一下元素\n }\n }\n\n public get volume(): number { // 获取当前音量 (0 ~ 1)\n const video = this.decoder\n return video && video.volume\n }\n\n public set volume(volume: number) { // 设置音量 (0 ~ 1)\n const video = this.decoder\n if (video) video.volume = volume\n }\n\n public get paused(): boolean {\n const video = this.decoder\n return video && video.paused\n }\n\n public get ended(): boolean {\n const video = this.decoder\n return video && video.ended\n }\n\n\n constructor(element: IUI) {\n this.element = element\n }\n\n\n public togglePlay(): void {\n const { playerOptions } = this\n if (playerOptions) {\n if (playerOptions.paused !== false) this.play()\n else this.pause()\n }\n }\n\n public play(): void {\n const { playerOptions } = this\n if (playerOptions && playerOptions.paused !== false) {\n playerOptions.paused = false;\n (this.element || this as any as IUI).forceRender()\n }\n }\n\n public pause(): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.paused = true\n this.decoder.pause()\n }\n }\n\n public stop(): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.nowIndex = 0\n this.currentTime = 0\n this.pause()\n }\n }\n}\n","import { LeaferVideo, Platform, Creator, PaintImage, Resource, Plugin, isObject } from '@leafer-ui/draw'\nimport { ILeaferVideo, ILeaferVideoConfig, IImageCrossOrigin, ILeaf, ILeafPaint, IVideoFileType } from '@leafer-ui/interface'\n\nimport { VideoDecoder } from './VideoDecoder'\n\nexport { Video } from './Video'\nexport { VideoData } from './data/VideoData'\nexport { VideoDecoder } from './VideoDecoder'\nexport { PaintVideo } from './PaintVideo'\n\n\nPlugin.add('video')\n\n\nPaintImage.video = function (paint: ILeafPaint, oldPaint?: ILeafPaint): void {\n paint.film = true\n paint.nowIndex = 0\n if (isObject(oldPaint)) {\n paint.paused = oldPaint.paused\n paint.loop = oldPaint.loop\n }\n}\n\nCreator.video = function (options?: ILeaferVideoConfig): ILeaferVideo {\n return new LeaferVideo(options)\n}\n\nResource.loadVideo = function (key: string, format?: IVideoFileType): Promise<ILeaferVideo> {\n return new Promise((resolve, reject) => {\n const config: ILeaferVideoConfig = { url: key }\n if (format) config.format = format\n const video = Creator.video(config)\n Resource.set(key, video)\n video.load(() => resolve(video), (e: any) => reject(e))\n })\n}\n\nLeaferVideo.prototype.render = function (canvas: any, x: number, y: number, width: number, height: number, leaf: ILeaf, paint: any, imageScaleX: number, imageScaleY: number): void {\n this.view.render(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY)\n}\n\n\nPlatform.origin.loadVideo = async function (url: string, _crossOrigin?: IImageCrossOrigin, _leaferVideo?: ILeaferVideo): Promise<any> {\n //const buffer = await Platform.origin.loadContent(url, 'arrayBuffer')\n\n // let ext = getFileExt(url) // 获取文件后缀名\n\n // if (!ext) {\n // if (leaferVideo) ext = leaferVideo.config.format\n // if (!ext) ext = 'gif'\n // }\n\n // const mimeType = FileHelper.mimeType(ext)\n const video = createVideoElement(url)\n\n const decoder = new VideoDecoder()\n\n const { width, height, duration } = await waitVideoMetadata(video)\n decoder.decoder = video\n decoder.width = width\n decoder.height = height\n decoder.duration = duration\n\n await waitVideoFrameReady(video)\n\n return decoder\n}\n\n/**\n * 创建并配置一个隐藏的 HTMLVideoElement\n */\nfunction createVideoElement(url: string, muted = false, loop = false): HTMLVideoElement {\n const video = document.createElement('video')\n video.src = url\n video.muted = muted\n video.loop = loop\n\n // 必须设置 playsInline 保证在移动端浏览器内联播放,而不是弹窗全屏\n video.playsInline = true\n //video.webkitPlaysInline = true\n\n // 允许跨域(如果视频托管在 CDN,Canvas 绘制需要此属性避免 Canvas 污染/报错)\n video.crossOrigin = 'anonymous'\n\n return video\n}\n\n/**\n * 等待视频元数据加载完毕,返回视频的尺寸与时长信息\n */\nfunction waitVideoMetadata(video: HTMLVideoElement): Promise<{ width: number; height: number; duration: number }> {\n return new Promise((resolve) => {\n if (video.readyState >= 1) { // HAVE_METADATA 及以上\n resolve({\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n })\n } else {\n video.addEventListener('loadedmetadata', () => {\n resolve({\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n })\n }, { once: true })\n }\n })\n}\n\n/**\n * 等待视频首帧可绘制到 Canvas\n */\nexport function waitVideoFrameReady(video: HTMLVideoElement): Promise<void> {\n return new Promise((resolve) => {\n if ('requestVideoFrameCallback' in video) {\n video.requestVideoFrameCallback(() => resolve())\n return\n }\n\n if ((video as any).readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n resolve()\n return\n }\n\n (video as any).addEventListener('loadeddata', () => resolve(), {\n once: true\n })\n })\n}","import { IVideo, IVideoInputData, IVideoData, IVideoDecoder, ILeafPaint } from '@leafer-ui/interface'\nimport { Image, registerUI, dataProcessor, useModule } from '@leafer-ui/draw'\n\nimport { VideoData } from './data/VideoData'\nimport { PaintVideo } from './PaintVideo'\n\n\n@useModule(PaintVideo)\n@registerUI()\nexport class Video<TInputData = IVideoInputData> extends Image<TInputData> implements IVideo {\n\n public get __tag() { return 'Video' }\n\n @dataProcessor(VideoData)\n declare public __: IVideoData\n\n public autoplay?: boolean\n\n public muted?: boolean\n\n public loop?: boolean\n}\n\nexport interface Video {\n\n readonly playerOptions: ILeafPaint\n readonly decoder: IVideoDecoder\n\n duration: number // 总时长\n currentTime: number // 当前播放进度 (秒)\n volume: number // 音量 0 ~1 \n\n readonly paused: boolean\n readonly ended: boolean // 是否播放结束\n\n togglePlay(): void\n play(): void\n pause(): void\n stop(): void\n}"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","SuppressedError","VideoDecoder","currentTime","this","decoder","time","video","targetTime","MathHelper","within","duration","volume","targetVolume","muted","paused","ended","register","type","Decoder","force","decoderMap","load","play","pause","render","canvas","x","y","width","height","leaf","playOptions","_imageScaleX","_imageScaleY","loop","drawImage","forceRender","destroyDecoder","src","close","VideoData","ImageData","__urlType","PaintVideo","playerOptions","fill","element","__","isArray","find","item","image","view","addEventListener","once","constructor","togglePlay","stop","nowIndex","waitVideoFrameReady","requestVideoFrameCallback","readyState","HTMLMediaElement","HAVE_CURRENT_DATA","Video","Image","__tag","dataProcessor","prototype","useModule","registerUI","Plugin","add","PaintImage","paint","oldPaint","film","isObject","Creator","options","LeaferVideo","Resource","loadVideo","format","config","url","set","imageScaleX","imageScaleY","Platform","origin","_crossOrigin","_leaferVideo","document","createElement","playsInline","crossOrigin","createVideoElement","videoWidth","videoHeight","waitVideoMetadata"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
this.LeaferIN=this.LeaferIN||{},this.LeaferIN.video=function(e,t){"use strict";function r(e,t,r,o){var d,n=arguments.length,i=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,o);else for(var s=e.length-1;s>=0;s--)(d=e[s])&&(i=(n<3?d(i):n>3?d(t,r,i):d(t,r))||i);return n>3&&i&&Object.defineProperty(t,r,i),i}function o(e,t,r,o){return new(r||(r=Promise))(function(d,n){function i(e){try{a(o.next(e))}catch(e){n(e)}}function s(e){try{a(o.throw(e))}catch(e){n(e)}}function a(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(i,s)}a((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class d{get currentTime(){return this.decoder.currentTime}set currentTime(e){const r=this.decoder,o=t.MathHelper.within(e,0,this.duration);r.currentTime=o}get volume(){return this.decoder.volume}set volume(e){const r=this.decoder,o=t.MathHelper.within(e,0,1);r.volume=o,o>0&&r.muted&&(r.muted=!1)}get paused(){return this.decoder.paused}get ended(){return this.decoder.ended}static register(e,t,r){d.decoderMap[e]={Decoder:t,force:r}}load(){}play(){this.decoder.play()}pause(){this.decoder.pause()}render(e,t,r,o,d,n,i,s,a){let{paused:c}=i;const u=this.decoder;u.ended&&(u.pause(),i.paused=!0,i.loop=(i.loop||0)+1),!1===c&&u.paused?this.play():!0!==c||u.paused?i.paused=u.paused:this.pause(),e.drawImage(u,t,r,o,d),u.paused||n.forceRender()}destroyDecoder(){const e=this.decoder;e&&(e.pause(),e.src="",e.load(),this.decoder=null)}close(){this.destroyDecoder()}}d.decoderMap={};class n extends t.ImageData{get __urlType(){return"video"}}class i{get playerOptions(){const{fill:e}=(this.element||this).__;return t.isArray(e)&&e.find(e=>"video"===e.type)}get decoder(){const{playerOptions:e}=this;return e&&e.image&&e.image.view}get duration(){const e=this.decoder;return e&&e.duration}get currentTime(){const e=this.decoder;return e&&e.currentTime}set currentTime(e){const t=this.decoder;t&&(t.currentTime=e,t.decoder.addEventListener("seeked",()=>(this.element||this).forceRender(),{once:!0}))}get volume(){const e=this.decoder;return e&&e.volume}set volume(e){const t=this.decoder;t&&(t.volume=e)}get paused(){const e=this.decoder;return e&&e.paused}get ended(){const e=this.decoder;return e&&e.ended}constructor(e){this.element=e}togglePlay(){const{playerOptions:e}=this;e&&(!1!==e.paused?this.play():this.pause())}play(){const{playerOptions:e}=this;e&&!1!==e.paused&&(e.paused=!1,(this.element||this).forceRender())}pause(){const{playerOptions:e}=this;e&&(e.paused=!0,this.decoder.pause())}stop(){const{playerOptions:e}=this;e&&(e.nowIndex=0,this.currentTime=0,this.pause())}}function s(e){return new Promise(t=>{"requestVideoFrameCallback"in e?e.requestVideoFrameCallback(()=>t()):e.readyState>=HTMLMediaElement.HAVE_CURRENT_DATA?t():e.addEventListener("loadeddata",()=>t(),{once:!0})})}return e.Video=class extends t.Image{get __tag(){return"Video"}},r([t.dataProcessor(n)],e.Video.prototype,"__",void 0),e.Video=r([t.useModule(i),t.registerUI()],e.Video),t.Plugin.add("video"),t.PaintImage.video=function(e,r){e.film=!0,e.nowIndex=0,t.isObject(r)&&(e.paused=r.paused,e.loop=r.loop)},t.Creator.video=function(e){return new t.LeaferVideo(e)},t.Resource.loadVideo=function(e,r){return new Promise((o,d)=>{const n={url:e};r&&(n.format=r);const i=t.Creator.video(n);t.Resource.set(e,i),i.load(()=>o(i),e=>d(e))})},t.LeaferVideo.prototype.render=function(e,t,r,o,d,n,i,s,a){this.view.render(e,t,r,o,d,n,i,s,a)},t.Platform.origin.loadVideo=function(e,t,r){return o(this,void 0,void 0,function*(){const t=function(e,t=!1,r=!1){const o=document.createElement("video");return o.src=e,o.muted=t,o.loop=r,o.playsInline=!0,o.crossOrigin="anonymous",o}(e),r=new d,{width:o,height:n,duration:i}=yield function(e){return new Promise(t=>{e.readyState>=1?t({width:e.videoWidth,height:e.videoHeight,duration:e.duration}):e.addEventListener("loadedmetadata",()=>{t({width:e.videoWidth,height:e.videoHeight,duration:e.duration})},{once:!0})})}(t);return r.decoder=t,r.width=o,r.height=n,r.duration=i,yield s(t),r})},e.PaintVideo=i,e.VideoData=n,e.VideoDecoder=d,e.waitVideoFrameReady=s,e}({},LeaferUI);
|
|
2
|
+
//# sourceMappingURL=video.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.min.js","sources":["../../../../../node_modules/.pnpm/@rollup+plugin-typescript@11.1.6_rollup@4.44.2_tslib@2.8.1_typescript@5.8.3/node_modules/tslib/tslib.es6.js","../../../../../../src/in/packages/video/src/VideoDecoder.ts","../../../../../../src/in/packages/video/src/data/VideoData.ts","../../../../../../src/in/packages/video/src/PaintVideo.ts","../../../../../../src/in/packages/video/src/index.ts","../../../../../../src/in/packages/video/src/Video.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { MathHelper } from '@leafer-ui/draw'\nimport { ICanvasContext2D, IVideoDecoder, IVideoFileType, ILeaf, IVideoPlayOptions } from '@leafer-ui/interface'\n\n\ninterface IVideoDecoderMap {\n [name: string]: { Decoder: any, force?: boolean }\n}\n\nexport class VideoDecoder implements IVideoDecoder {\n\n public width: number // 宽度\n public height: number // 高度\n\n public duration: number\n\n public get currentTime(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video.currentTime\n }\n\n public set currentTime(time: number) { // 设置播放进度\n const video = this.decoder\n const targetTime = MathHelper.within(time, 0, this.duration)\n video.currentTime = targetTime\n }\n\n public get volume(): number { // 获取当前音量 (0 ~ 1)\n const video = this.decoder\n return video.volume\n }\n\n public set volume(volume: number) { // 设置音量 (0 ~ 1)\n const video = this.decoder\n const targetVolume = MathHelper.within(volume, 0, 1)\n video.volume = targetVolume\n if (targetVolume > 0 && video.muted) video.muted = false // 如果音量大于 0,确保解除静音状态\n }\n\n public get paused(): boolean {\n const video = this.decoder\n return video.paused\n }\n\n public get ended(): boolean {\n const video = this.decoder\n return video.ended\n }\n\n public loop: number // 循环次数,为0表示无限循环\n\n public decoder: HTMLVideoElement // 解码器\n\n // 缓冲画布\n public bufferCanvas?: any\n public bufferContext?: ICanvasContext2D\n\n static decoderMap: IVideoDecoderMap = {}\n\n static register(type: IVideoFileType, Decoder: any, force?: boolean): void {\n VideoDecoder.decoderMap[type] = { Decoder, force }\n }\n\n public load(): Promise<void> {\n return undefined\n }\n\n public play(): void {\n const video = this.decoder\n video.play()\n }\n\n public pause(): void {\n const video = this.decoder\n video.pause()\n }\n\n\n public render(canvas: ICanvasContext2D, x: number, y: number, width: number, height: number, leaf: ILeaf, playOptions: IVideoPlayOptions, _imageScaleX: number, _imageScaleY: number): void {\n let { paused } = playOptions\n\n const video = this.decoder\n if (video.ended) {\n video.pause()\n playOptions.paused = true\n playOptions.loop = (playOptions.loop as number || 0) + 1\n }\n\n if (paused === false && video.paused) {\n this.play()\n } else if (paused === true && !video.paused) {\n this.pause()\n } else {\n playOptions.paused = video.paused\n }\n\n // 仅在视频处于播放状态,且有实际数据更新时进行绘制\n canvas.drawImage(video, x, y, width, height)\n\n if (!video.paused) leaf.forceRender() // 防止停掉\n }\n\n\n public destroyDecoder(): void {\n const video = this.decoder\n if (video) {\n\n video.pause()\n video.src = ''\n video.load()\n this.decoder = null\n }\n }\n\n public close(): void {\n this.destroyDecoder()\n }\n\n}\n","import { IMultimediaType } from '@leafer-ui/interface'\nimport { ImageData } from '@leafer-ui/draw'\n\n\nexport class VideoData extends ImageData {\n\n public get __urlType(): IMultimediaType { return 'video' }\n\n}","import { ILeafPaint, IVideoDecoder, IUI } from '@leafer-ui/interface'\nimport { isArray } from '@leafer-ui/draw'\n\nexport class PaintVideo {\n\n public element: IUI\n\n public get playerOptions(): ILeafPaint { const { fill } = (this.element || this as any).__; return isArray(fill) && fill.find(item => item.type === 'video') }\n\n public get decoder(): IVideoDecoder { const { playerOptions } = this; return playerOptions && playerOptions.image && playerOptions.image.view }\n\n public get duration(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video && video.duration\n }\n\n public get currentTime(): number { // 获取当前播放进度 (秒)\n const video = this.decoder\n return video && video.currentTime\n }\n\n public set currentTime(time: number) { // 设置播放进度\n const video = this.decoder\n if (video) {\n video.currentTime = time\n video.decoder.addEventListener('seeked', () => (this.element || this as any as IUI).forceRender(), { once: true }) // 需要强制更新一下元素\n }\n }\n\n public get volume(): number { // 获取当前音量 (0 ~ 1)\n const video = this.decoder\n return video && video.volume\n }\n\n public set volume(volume: number) { // 设置音量 (0 ~ 1)\n const video = this.decoder\n if (video) video.volume = volume\n }\n\n public get paused(): boolean {\n const video = this.decoder\n return video && video.paused\n }\n\n public get ended(): boolean {\n const video = this.decoder\n return video && video.ended\n }\n\n\n constructor(element: IUI) {\n this.element = element\n }\n\n\n public togglePlay(): void {\n const { playerOptions } = this\n if (playerOptions) {\n if (playerOptions.paused !== false) this.play()\n else this.pause()\n }\n }\n\n public play(): void {\n const { playerOptions } = this\n if (playerOptions && playerOptions.paused !== false) {\n playerOptions.paused = false;\n (this.element || this as any as IUI).forceRender()\n }\n }\n\n public pause(): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.paused = true\n this.decoder.pause()\n }\n }\n\n public stop(): void {\n const { playerOptions } = this\n if (playerOptions) {\n playerOptions.nowIndex = 0\n this.currentTime = 0\n this.pause()\n }\n }\n}\n","import { LeaferVideo, Platform, Creator, PaintImage, Resource, Plugin, isObject } from '@leafer-ui/draw'\nimport { ILeaferVideo, ILeaferVideoConfig, IImageCrossOrigin, ILeaf, ILeafPaint, IVideoFileType } from '@leafer-ui/interface'\n\nimport { VideoDecoder } from './VideoDecoder'\n\nexport { Video } from './Video'\nexport { VideoData } from './data/VideoData'\nexport { VideoDecoder } from './VideoDecoder'\nexport { PaintVideo } from './PaintVideo'\n\n\nPlugin.add('video')\n\n\nPaintImage.video = function (paint: ILeafPaint, oldPaint?: ILeafPaint): void {\n paint.film = true\n paint.nowIndex = 0\n if (isObject(oldPaint)) {\n paint.paused = oldPaint.paused\n paint.loop = oldPaint.loop\n }\n}\n\nCreator.video = function (options?: ILeaferVideoConfig): ILeaferVideo {\n return new LeaferVideo(options)\n}\n\nResource.loadVideo = function (key: string, format?: IVideoFileType): Promise<ILeaferVideo> {\n return new Promise((resolve, reject) => {\n const config: ILeaferVideoConfig = { url: key }\n if (format) config.format = format\n const video = Creator.video(config)\n Resource.set(key, video)\n video.load(() => resolve(video), (e: any) => reject(e))\n })\n}\n\nLeaferVideo.prototype.render = function (canvas: any, x: number, y: number, width: number, height: number, leaf: ILeaf, paint: any, imageScaleX: number, imageScaleY: number): void {\n this.view.render(canvas, x, y, width, height, leaf, paint, imageScaleX, imageScaleY)\n}\n\n\nPlatform.origin.loadVideo = async function (url: string, _crossOrigin?: IImageCrossOrigin, _leaferVideo?: ILeaferVideo): Promise<any> {\n //const buffer = await Platform.origin.loadContent(url, 'arrayBuffer')\n\n // let ext = getFileExt(url) // 获取文件后缀名\n\n // if (!ext) {\n // if (leaferVideo) ext = leaferVideo.config.format\n // if (!ext) ext = 'gif'\n // }\n\n // const mimeType = FileHelper.mimeType(ext)\n const video = createVideoElement(url)\n\n const decoder = new VideoDecoder()\n\n const { width, height, duration } = await waitVideoMetadata(video)\n decoder.decoder = video\n decoder.width = width\n decoder.height = height\n decoder.duration = duration\n\n await waitVideoFrameReady(video)\n\n return decoder\n}\n\n/**\n * 创建并配置一个隐藏的 HTMLVideoElement\n */\nfunction createVideoElement(url: string, muted = false, loop = false): HTMLVideoElement {\n const video = document.createElement('video')\n video.src = url\n video.muted = muted\n video.loop = loop\n\n // 必须设置 playsInline 保证在移动端浏览器内联播放,而不是弹窗全屏\n video.playsInline = true\n //video.webkitPlaysInline = true\n\n // 允许跨域(如果视频托管在 CDN,Canvas 绘制需要此属性避免 Canvas 污染/报错)\n video.crossOrigin = 'anonymous'\n\n return video\n}\n\n/**\n * 等待视频元数据加载完毕,返回视频的尺寸与时长信息\n */\nfunction waitVideoMetadata(video: HTMLVideoElement): Promise<{ width: number; height: number; duration: number }> {\n return new Promise((resolve) => {\n if (video.readyState >= 1) { // HAVE_METADATA 及以上\n resolve({\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n })\n } else {\n video.addEventListener('loadedmetadata', () => {\n resolve({\n width: video.videoWidth,\n height: video.videoHeight,\n duration: video.duration\n })\n }, { once: true })\n }\n })\n}\n\n/**\n * 等待视频首帧可绘制到 Canvas\n */\nexport function waitVideoFrameReady(video: HTMLVideoElement): Promise<void> {\n return new Promise((resolve) => {\n if ('requestVideoFrameCallback' in video) {\n video.requestVideoFrameCallback(() => resolve())\n return\n }\n\n if ((video as any).readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n resolve()\n return\n }\n\n (video as any).addEventListener('loadeddata', () => resolve(), {\n once: true\n })\n })\n}","import { IVideo, IVideoInputData, IVideoData, IVideoDecoder, ILeafPaint } from '@leafer-ui/interface'\nimport { Image, registerUI, dataProcessor, useModule } from '@leafer-ui/draw'\n\nimport { VideoData } from './data/VideoData'\nimport { PaintVideo } from './PaintVideo'\n\n\n@useModule(PaintVideo)\n@registerUI()\nexport class Video<TInputData = IVideoInputData> extends Image<TInputData> implements IVideo {\n\n public get __tag() { return 'Video' }\n\n @dataProcessor(VideoData)\n declare public __: IVideoData\n\n public autoplay?: boolean\n\n public muted?: boolean\n\n public loop?: boolean\n}\n\nexport interface Video {\n\n readonly playerOptions: ILeafPaint\n readonly decoder: IVideoDecoder\n\n duration: number // 总时长\n currentTime: number // 当前播放进度 (秒)\n volume: number // 音量 0 ~1 \n\n readonly paused: boolean\n readonly ended: boolean // 是否播放结束\n\n togglePlay(): void\n play(): void\n pause(): void\n stop(): void\n}"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","SuppressedError","VideoDecoder","currentTime","this","decoder","time","video","targetTime","MathHelper","within","duration","volume","targetVolume","muted","paused","ended","register","type","Decoder","force","decoderMap","load","play","pause","render","canvas","x","y","width","height","leaf","playOptions","_imageScaleX","_imageScaleY","loop","drawImage","forceRender","destroyDecoder","src","close","VideoData","ImageData","__urlType","PaintVideo","playerOptions","fill","element","__","isArray","find","item","image","view","addEventListener","once","constructor","togglePlay","stop","nowIndex","waitVideoFrameReady","requestVideoFrameCallback","readyState","HTMLMediaElement","HAVE_CURRENT_DATA","Video","Image","__tag","dataProcessor","prototype","useModule","registerUI","Plugin","add","PaintImage","paint","oldPaint","film","isObject","Creator","options","LeaferVideo","Resource","loadVideo","format","config","url","set","imageScaleX","imageScaleY","Platform","origin","_crossOrigin","_leaferVideo","document","createElement","playsInline","crossOrigin","createVideoElement","videoWidth","videoHeight","waitVideoMetadata"],"mappings":"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","x_google_ignoreList":[0]}
|