{"version":3,"file":"loadVideo.mjs","sources":["../../../../src/loader/parsers/textures/loadVideo.ts"],"sourcesContent":["import { BaseTexture, extensions, ExtensionType, settings, utils, VideoResource } from '@pixi/core';\nimport { checkDataUrl } from '../../../utils/checkDataUrl';\nimport { checkExtension } from '../../../utils/checkExtension';\nimport { LoaderParserPriority } from '../LoaderParser';\nimport { createTexture } from './utils/createTexture';\n\nimport type { IBaseTextureOptions, IVideoResourceOptions, Texture } from '@pixi/core';\nimport type { ResolvedAsset } from '../../../types';\nimport type { Loader } from '../../Loader';\nimport type { LoaderParser } from '../LoaderParser';\n\nconst validVideoExtensions = ['.mp4', '.m4v', '.webm', '.ogv'];\nconst validVideoMIMEs = [\n    'video/mp4',\n    'video/webm',\n    'video/ogg',\n];\n\n/**\n * Configuration for the `loadVideo` loader parser.\n * @memberof PIXI\n * @see PIXI.loadVideo\n */\nexport interface LoadVideoConfig\n{\n    /**\n     * When set to `true`, the video will start playing automatically after being loaded,\n     * otherwise it will not start playing automatically.\n     * @default true\n     */\n    defaultAutoPlay: boolean;\n\n    /**\n     * How many times a second to update the texture of the loaded video by default.\n     * If 0, `requestVideoFrameCallback` is used to update the texture.\n     * If `requestVideoFrameCallback` is not available, the texture is updated every render.\n     * @default 0\n     */\n    defaultUpdateFPS: number;\n\n    /**\n     * When set to `true`, the loaded video will loop by default.\n     * @default false\n     */\n    defaultLoop: boolean;\n\n    /**\n     * When set to `true`, the loaded video will be muted.\n     * @default false\n     */\n    defaultMuted: boolean;\n\n    /**\n     * When set to `true`, opening the video on mobile devices is prevented.\n     * @default true\n     */\n    defaultPlaysinline: boolean;\n}\n\n/**\n * Loads videos into Textures.\n * @memberof PIXI\n */\nexport const loadVideo = {\n    name: 'loadVideo',\n\n    extension: {\n        type: ExtensionType.LoadParser,\n        priority: LoaderParserPriority.High,\n    },\n\n    config: {\n        defaultAutoPlay: true,\n        defaultUpdateFPS: 0,\n        defaultLoop: false,\n        defaultMuted: false,\n        defaultPlaysinline: true,\n    },\n\n    test(url: string): boolean\n    {\n        return checkDataUrl(url, validVideoMIMEs) || checkExtension(url, validVideoExtensions);\n    },\n\n    async load(\n        url: string,\n        loadAsset?: ResolvedAsset<IBaseTextureOptions<IVideoResourceOptions>>,\n        loader?: Loader): Promise<Texture>\n    {\n        let texture: Texture;\n        const response = await settings.ADAPTER.fetch(url);\n        const blob = await response.blob();\n        const blobURL = URL.createObjectURL(blob);\n\n        try\n        {\n            const options = {\n                autoPlay: this.config.defaultAutoPlay,\n                updateFPS: this.config.defaultUpdateFPS,\n                loop: this.config.defaultLoop,\n                muted: this.config.defaultMuted,\n                playsinline: this.config.defaultPlaysinline,\n                ...loadAsset?.data?.resourceOptions,\n                autoLoad: true,\n            };\n            const src = new VideoResource(blobURL, options);\n\n            await src.load();\n\n            const base = new BaseTexture(src, {\n                alphaMode: await utils.detectVideoAlphaMode(),\n                resolution: utils.getResolutionOfUrl(url),\n                ...loadAsset?.data,\n            });\n\n            base.resource.src = url;\n            texture = createTexture(base, loader, url);\n            texture.baseTexture.once('destroyed', () =>\n            {\n                URL.revokeObjectURL(blobURL);\n            });\n        }\n        catch (e)\n        {\n            URL.revokeObjectURL(blobURL);\n\n            throw e;\n        }\n\n        return texture;\n    },\n\n    unload(texture: Texture): void\n    {\n        texture.destroy(true);\n    }\n} as LoaderParser<Texture, IBaseTextureOptions<IVideoResourceOptions>, LoadVideoConfig>;\n\nextensions.add(loadVideo);\n"],"names":[],"mappings":";;;;;AAWA,MAAM,uBAAuB,CAAC,QAAQ,QAAQ,SAAS,MAAM,GACvD,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,GA+Ca,YAAY;AAAA,EACrB,MAAM;AAAA,EAEN,WAAW;AAAA,IACP,MAAM,cAAc;AAAA,IACpB,UAAU,qBAAqB;AAAA,EACnC;AAAA,EAEA,QAAQ;AAAA,IACJ,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,oBAAoB;AAAA,EACxB;AAAA,EAEA,KAAK,KACL;AACI,WAAO,aAAa,KAAK,eAAe,KAAK,eAAe,KAAK,oBAAoB;AAAA,EACzF;AAAA,EAEA,MAAM,KACF,KACA,WACA,QACJ;AACQ,QAAA;AAEJ,UAAM,OAAO,OADI,MAAM,SAAS,QAAQ,MAAM,GAAG,GACrB,KAAK,GAC3B,UAAU,IAAI,gBAAgB,IAAI;AAGxC,QAAA;AACI,YAAM,UAAU;AAAA,QACZ,UAAU,KAAK,OAAO;AAAA,QACtB,WAAW,KAAK,OAAO;AAAA,QACvB,MAAM,KAAK,OAAO;AAAA,QAClB,OAAO,KAAK,OAAO;AAAA,QACnB,aAAa,KAAK,OAAO;AAAA,QACzB,GAAG,WAAW,MAAM;AAAA,QACpB,UAAU;AAAA,MAER,GAAA,MAAM,IAAI,cAAc,SAAS,OAAO;AAE9C,YAAM,IAAI;AAEJ,YAAA,OAAO,IAAI,YAAY,KAAK;AAAA,QAC9B,WAAW,MAAM,MAAM,qBAAqB;AAAA,QAC5C,YAAY,MAAM,mBAAmB,GAAG;AAAA,QACxC,GAAG,WAAW;AAAA,MAAA,CACjB;AAED,WAAK,SAAS,MAAM,KACpB,UAAU,cAAc,MAAM,QAAQ,GAAG,GACzC,QAAQ,YAAY,KAAK,aAAa,MACtC;AACI,YAAI,gBAAgB,OAAO;AAAA,MAAA,CAC9B;AAAA,aAEE,GACP;AACQ,YAAA,IAAA,gBAAgB,OAAO,GAErB;AAAA,IACV;AAEO,WAAA;AAAA,EACX;AAAA,EAEA,OAAO,SACP;AACI,YAAQ,QAAQ,EAAI;AAAA,EACxB;AACJ;AAEA,WAAW,IAAI,SAAS;"}