framefields 2.6.1 → 2.7.0
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/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-CYrO9q9P.mjs → audio-j3ttoRDX.mjs} +4 -4
- package/dist/{audio-CYrO9q9P.mjs.map → audio-j3ttoRDX.mjs.map} +1 -1
- package/dist/{audio-B5mdR8vv.d.mts → audio-tL8CcPra.d.mts} +3 -3
- package/dist/{audio-B5mdR8vv.d.mts.map → audio-tL8CcPra.d.mts.map} +1 -1
- package/dist/components/index.d.mts +10 -10
- package/dist/components/index.mjs +44 -44
- package/dist/{dist-cC6nOaMR.mjs → dist-BHTd-EC1.mjs} +164 -34
- package/dist/dist-BHTd-EC1.mjs.map +1 -0
- package/dist/{dist-DSKhnhDk.mjs → dist-BM0ilHvQ.mjs} +115 -21
- package/dist/dist-BM0ilHvQ.mjs.map +1 -0
- package/dist/{dist-D021IFfp.mjs → dist-BRXsfWKQ.mjs} +444 -8
- package/dist/dist-BRXsfWKQ.mjs.map +1 -0
- package/dist/{dist-BPOi5xb_.mjs → dist-CPtFZxtu.mjs} +2 -2
- package/dist/{dist-BPOi5xb_.mjs.map → dist-CPtFZxtu.mjs.map} +1 -1
- package/dist/effects/index.d.mts +4 -4
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-Dvdwndk0.mjs → effects-Dy661XS_.mjs} +3 -3
- package/dist/{effects-Dvdwndk0.mjs.map → effects-Dy661XS_.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-B6a4CyoM.mjs → fonts-BcFhAqqO.mjs} +2 -2
- package/dist/{fonts-B6a4CyoM.mjs.map → fonts-BcFhAqqO.mjs.map} +1 -1
- package/dist/{gpu-CrQADlcf.mjs → gpu-zIhSz_0X.mjs} +2 -2
- package/dist/{gpu-CrQADlcf.mjs.map → gpu-zIhSz_0X.mjs.map} +1 -1
- package/dist/{index-ocZc12ZS.d.mts → index-B1ENegOQ.d.mts} +224 -2
- package/dist/index-B1ENegOQ.d.mts.map +1 -0
- package/dist/{index-D-Gnyffj.d.mts → index-CJRTBLZ4.d.mts} +4 -4
- package/dist/{index-D-Gnyffj.d.mts.map → index-CJRTBLZ4.d.mts.map} +1 -1
- package/dist/{index-BhzlG_1Q.d.mts → index-Cg30slle.d.mts} +2 -2
- package/dist/{index-BhzlG_1Q.d.mts.map → index-Cg30slle.d.mts.map} +1 -1
- package/dist/{index-B4o6F1JC.d.mts → index-DeeMmoEA.d.mts} +2 -2
- package/dist/{index-B4o6F1JC.d.mts.map → index-DeeMmoEA.d.mts.map} +1 -1
- package/dist/{index-CWG19cm-.d.mts → index-ePGQ_C7f.d.mts} +39 -16
- package/dist/index-ePGQ_C7f.d.mts.map +1 -0
- package/dist/{index-o8LxWdwz.d.mts → index-l1yRugLc.d.mts} +3 -3
- package/dist/{index-o8LxWdwz.d.mts.map → index-l1yRugLc.d.mts.map} +1 -1
- package/dist/{index-3Vdef2KE.d.mts → index-uDZ9Yuv-.d.mts} +5 -8
- package/dist/index-uDZ9Yuv-.d.mts.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.mjs +53 -53
- package/dist/preview/index.d.mts +3 -3
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-OTsGYyOU.mjs → preview-IpdVFuxv.mjs} +3 -2
- package/dist/{preview-OTsGYyOU.mjs.map → preview-IpdVFuxv.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-RF62TV3G.mjs → chunk-25WRUINA.mjs} +1 -1
- package/dist/preview-engine/{chunk-MMVFX42U.mjs → chunk-2AEWPT6Y.mjs} +1 -1
- package/dist/preview-engine/{chunk-IIOHF7MH.mjs → chunk-2MDTUA3W.mjs} +1 -1
- package/dist/preview-engine/{chunk-KWTTANYN.mjs → chunk-2TLABBER.mjs} +1 -1
- package/dist/preview-engine/{chunk-MUOJMF7M.mjs → chunk-3QOJVABU.mjs} +1 -1
- package/dist/preview-engine/{chunk-RDEQ4LQU.mjs → chunk-4Q3ZUTQC.mjs} +1 -1
- package/dist/preview-engine/{chunk-OXXRKNHW.mjs → chunk-5BXCJ2QX.mjs} +1 -1
- package/dist/preview-engine/{chunk-JTT3YX7W.mjs → chunk-5R4UF7YK.mjs} +1 -1
- package/dist/preview-engine/{chunk-4C26NVQY.mjs → chunk-6THE6J3A.mjs} +1 -1
- package/dist/preview-engine/{chunk-SVE3XWO7.mjs → chunk-6VDYWMP5.mjs} +1 -1
- package/dist/preview-engine/{chunk-ULPLHKM2.mjs → chunk-7B7QQDPZ.mjs} +1 -1
- package/dist/preview-engine/{chunk-ULVX4VYT.mjs → chunk-7ZA36EZE.mjs} +1 -1
- package/dist/preview-engine/{chunk-LYSU6S4O.mjs → chunk-AJ6BVUDB.mjs} +1 -1
- package/dist/preview-engine/{chunk-J24VHZS6.mjs → chunk-BDXGUSSF.mjs} +1 -1
- package/dist/preview-engine/{chunk-B7J72YSP.mjs → chunk-CC5V7UBF.mjs} +1 -1
- package/dist/preview-engine/{chunk-JD4TBC6Z.mjs → chunk-CP42LYD7.mjs} +1 -1
- package/dist/preview-engine/{chunk-LN3YAWUD.mjs → chunk-DJWDD3OE.mjs} +1 -1
- package/dist/preview-engine/{chunk-V3FODTPI.mjs → chunk-DZEWY4PR.mjs} +22 -22
- package/dist/preview-engine/{chunk-RKNV5N7D.mjs → chunk-ENGQ55LR.mjs} +1 -1
- package/dist/preview-engine/{chunk-AGLAJGQJ.mjs → chunk-FBXKVLTB.mjs} +14 -14
- package/dist/preview-engine/{chunk-MJCK5FLZ.mjs → chunk-FMEXTHL7.mjs} +1 -1
- package/dist/preview-engine/{chunk-UEQIO6AH.mjs → chunk-FQ7UCMWR.mjs} +1 -1
- package/dist/preview-engine/{chunk-TPFDAOW7.mjs → chunk-FRIBHQTM.mjs} +1 -1
- package/dist/preview-engine/chunk-FT7HJ6IE.mjs +3 -0
- package/dist/preview-engine/{chunk-YEPYVASB.mjs → chunk-G3UOUGIE.mjs} +1 -1
- package/dist/preview-engine/{chunk-4JX5LBE2.mjs → chunk-H4GDIVX4.mjs} +1 -1
- package/dist/preview-engine/{chunk-LHCEQ77S.mjs → chunk-HU73APZL.mjs} +1 -1
- package/dist/preview-engine/{chunk-DDFWN7DI.mjs → chunk-I7QIQURU.mjs} +1 -1
- package/dist/preview-engine/{chunk-3KHD67Q3.mjs → chunk-ID344UBN.mjs} +1 -1
- package/dist/preview-engine/{chunk-5NT7WWJR.mjs → chunk-IGCXUGHT.mjs} +1 -1
- package/dist/preview-engine/{chunk-QPBTLJ5W.mjs → chunk-IK3YA6MC.mjs} +1 -1
- package/dist/preview-engine/chunk-J5SKQFJ6.mjs +1 -0
- package/dist/preview-engine/{chunk-Q7JN4EHX.mjs → chunk-JOPZNSZJ.mjs} +1 -1
- package/dist/preview-engine/{chunk-SQ52PBF3.mjs → chunk-JOSNIMFT.mjs} +1 -1
- package/dist/preview-engine/{chunk-SXNCNG4L.mjs → chunk-JR443L5E.mjs} +1 -1
- package/dist/preview-engine/{chunk-FZLKPBKS.mjs → chunk-KCAFMWDM.mjs} +1 -1
- package/dist/preview-engine/{chunk-QRYCB6E3.mjs → chunk-LAEPNVOE.mjs} +1 -1
- package/dist/preview-engine/chunk-MAALUQK3.mjs +1974 -0
- package/dist/preview-engine/chunk-MHCXSWK7.mjs +1 -0
- package/dist/preview-engine/{chunk-4INGTMZ5.mjs → chunk-MWBARRK2.mjs} +1 -1
- package/dist/preview-engine/chunk-MXK2PP6K.mjs +1 -0
- package/dist/preview-engine/{chunk-GQIRV466.mjs → chunk-MXPN2GB7.mjs} +1 -1
- package/dist/preview-engine/{chunk-W2EZFV4Q.mjs → chunk-NHYB5YC3.mjs} +1 -1
- package/dist/preview-engine/{chunk-K3IMPV6T.mjs → chunk-PXSKIGAP.mjs} +6 -6
- package/dist/preview-engine/{chunk-SP22JWN2.mjs → chunk-PYM2FBFA.mjs} +1 -1
- package/dist/preview-engine/chunk-QDTJ4MOJ.mjs +1 -0
- package/dist/preview-engine/{chunk-6PMATELR.mjs → chunk-RQU2GFGH.mjs} +1 -1
- package/dist/preview-engine/{chunk-UQD2UE6I.mjs → chunk-RWDPBES3.mjs} +1 -1
- package/dist/preview-engine/{chunk-QVW5METG.mjs → chunk-S5ONWSZF.mjs} +1 -1
- package/dist/preview-engine/{chunk-2YGR5YCN.mjs → chunk-SIU6JU2R.mjs} +1 -1
- package/dist/preview-engine/{chunk-NQZRPPUU.mjs → chunk-SJ3Q4AQP.mjs} +1 -1
- package/dist/preview-engine/{chunk-Q6CRERSJ.mjs → chunk-T36SKUWK.mjs} +9 -9
- package/dist/preview-engine/chunk-TEBZRQPG.mjs +1 -0
- package/dist/preview-engine/{chunk-WDWHOXSA.mjs → chunk-UUDML2SN.mjs} +1 -1
- package/dist/preview-engine/{chunk-RHXZXWJ4.mjs → chunk-VAS4IJZR.mjs} +1 -1
- package/dist/preview-engine/{chunk-DOCFOSA6.mjs → chunk-WTDK6H46.mjs} +1 -1
- package/dist/preview-engine/chunk-XNMEVVQB.mjs +1 -0
- package/dist/preview-engine/{chunk-AKT4YQWL.mjs → chunk-YVGT4NK6.mjs} +2 -2
- package/dist/preview-engine/{chunk-ZGMA27IG.mjs → chunk-ZR4QFIJR.mjs} +1 -1
- package/dist/preview-engine/chunk-ZYTXBBIX.mjs +1 -0
- package/dist/preview-engine/components.mjs +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/fonts.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +1 -1
- package/dist/preview-engine/player.mjs +2 -2
- package/dist/preview-engine/{renderers-FC7G7KU7.mjs → renderers-2AKYMAIK.mjs} +1 -1
- package/dist/preview-engine/renderers-363CKEIG.mjs +1 -0
- package/dist/preview-engine/{renderers-EJGF3PYQ.mjs → renderers-36L24ZVS.mjs} +1 -1
- package/dist/preview-engine/renderers-3FMMVDMA.mjs +1 -0
- package/dist/preview-engine/{renderers-56TGEFDK.mjs → renderers-44AANAXR.mjs} +1 -1
- package/dist/preview-engine/renderers-4UUU62VV.mjs +1 -0
- package/dist/preview-engine/renderers-4ZTZFSAR.mjs +1 -0
- package/dist/preview-engine/{renderers-PYDOSDEY.mjs → renderers-5ZSB75GY.mjs} +1 -1
- package/dist/preview-engine/renderers-6KDD75BM.mjs +1 -0
- package/dist/preview-engine/renderers-7BJRD4G2.mjs +1 -0
- package/dist/preview-engine/{renderers-HBIBRZD7.mjs → renderers-AIIHGDJM.mjs} +1 -1
- package/dist/preview-engine/{renderers-P2FTCDZ7.mjs → renderers-AU746ORP.mjs} +1 -1
- package/dist/preview-engine/renderers-BIF2BETK.mjs +1 -0
- package/dist/preview-engine/{renderers-FD3ZT73R.mjs → renderers-BTQCHVHV.mjs} +1 -1
- package/dist/preview-engine/{renderers-HMNCIEU3.mjs → renderers-CFHBOAZG.mjs} +1 -1
- package/dist/preview-engine/renderers-CU5RW5UA.mjs +1 -0
- package/dist/preview-engine/renderers-DK5OBTKE.mjs +1 -0
- package/dist/preview-engine/renderers-EAKCDGTY.mjs +1 -0
- package/dist/preview-engine/{renderers-FYI6QNUH.mjs → renderers-EGBGC7MU.mjs} +1 -1
- package/dist/preview-engine/renderers-EVXCU7G7.mjs +1 -0
- package/dist/preview-engine/renderers-EXEYEH3F.mjs +1 -0
- package/dist/preview-engine/{renderers-RDHHVXRE.mjs → renderers-EXJDPS3T.mjs} +1 -1
- package/dist/preview-engine/renderers-F3WALPWI.mjs +1 -0
- package/dist/preview-engine/{renderers-4RVSLTCX.mjs → renderers-FS3EOB4J.mjs} +1 -1
- package/dist/preview-engine/{renderers-C3YXNKNM.mjs → renderers-GUL2MXDD.mjs} +1 -1
- package/dist/preview-engine/{renderers-EQDINUMT.mjs → renderers-H4HC44B5.mjs} +1 -1
- package/dist/preview-engine/renderers-H6565HO4.mjs +1 -0
- package/dist/preview-engine/renderers-HT5V6OZ2.mjs +1 -0
- package/dist/preview-engine/renderers-HXMOARWO.mjs +1 -0
- package/dist/preview-engine/renderers-HZ2Q7BGK.mjs +1 -0
- package/dist/preview-engine/renderers-I4N2K2KW.mjs +1 -0
- package/dist/preview-engine/renderers-I5J7U6CB.mjs +1 -0
- package/dist/preview-engine/renderers-IZV6QXR5.mjs +1 -0
- package/dist/preview-engine/renderers-JWGAPHWX.mjs +1 -0
- package/dist/preview-engine/renderers-KNDSVQTY.mjs +1 -0
- package/dist/preview-engine/renderers-KNDUOO6M.mjs +1 -0
- package/dist/preview-engine/renderers-KQAO3QEI.mjs +1 -0
- package/dist/preview-engine/{renderers-7SW2AHM2.mjs → renderers-LCSQLXRD.mjs} +1 -1
- package/dist/preview-engine/renderers-M34LOEHC.mjs +1 -0
- package/dist/preview-engine/renderers-ML6GNCWB.mjs +1 -0
- package/dist/preview-engine/renderers-NARG274F.mjs +1 -0
- package/dist/preview-engine/renderers-NCFPOSWR.mjs +1 -0
- package/dist/preview-engine/{renderers-ZAMSS7QN.mjs → renderers-PCOTECQB.mjs} +1 -1
- package/dist/preview-engine/renderers-PG5JHI2S.mjs +1 -0
- package/dist/preview-engine/{renderers-LTV5RFDJ.mjs → renderers-Q7MNLQJF.mjs} +1 -1
- package/dist/preview-engine/{renderers-GHP7SL5M.mjs → renderers-QXVSJYZL.mjs} +1 -1
- package/dist/preview-engine/{renderers-H2UI7YEO.mjs → renderers-R3ERZ3ZY.mjs} +1 -1
- package/dist/preview-engine/renderers-RXQKV65L.mjs +1 -0
- package/dist/preview-engine/renderers-SA73GD2B.mjs +1 -0
- package/dist/preview-engine/renderers-SLIXUHNX.mjs +1 -0
- package/dist/preview-engine/renderers-T462JZNA.mjs +1 -0
- package/dist/preview-engine/{renderers-LV6LLULR.mjs → renderers-TH2XZAYW.mjs} +1 -1
- package/dist/preview-engine/{renderers-ART3EGSZ.mjs → renderers-UHZIERVH.mjs} +1 -1
- package/dist/preview-engine/renderers-V7CFVGYK.mjs +1 -0
- package/dist/preview-engine/renderers-VY5E7BPK.mjs +1 -0
- package/dist/preview-engine/{renderers-ZDMDDWLN.mjs → renderers-WKXGELRG.mjs} +1 -1
- package/dist/preview-engine/{renderers-GY4R467B.mjs → renderers-WLDIIFR5.mjs} +1 -1
- package/dist/preview-engine/{renderers-NTKSN32T.mjs → renderers-WM6WBRH6.mjs} +1 -1
- package/dist/preview-engine/renderers-WT5FQZM7.mjs +228 -0
- package/dist/preview-engine/{renderers-YK74777T.mjs → renderers-WTKRLNNR.mjs} +1 -1
- package/dist/preview-engine/{renderers-BWRNCXR6.mjs → renderers-X6GKEVP7.mjs} +1 -1
- package/dist/preview-engine/renderers-Y47N5EYR.mjs +1 -0
- package/dist/preview-engine/renderers-Y4CUVZYI.mjs +1 -0
- package/dist/preview-engine/renderers-Y6YC7ZAK.mjs +1 -0
- package/dist/preview-engine/renderers-Y6ZYUAQG.mjs +1 -0
- package/dist/preview-engine/{renderers-YBTWN76S.mjs → renderers-YRWXYT5A.mjs} +1 -1
- package/dist/preview-engine/{renderers-SY435YU3.mjs → renderers-YWC4MXPG.mjs} +1 -1
- package/dist/preview-engine/{renderers-7GMW52G3.mjs → renderers-ZWNPYZN6.mjs} +1 -1
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-W4CWO2bp.mjs → program-KPBfq9tw.mjs} +95 -21
- package/dist/program-KPBfq9tw.mjs.map +1 -0
- package/dist/registry/index.json +1 -1
- package/dist/registry/lower-third.json +1 -1
- package/dist/registry/terminal.json +1 -1
- package/dist/registry/text-reveal.json +2 -2
- package/dist/registry/title-card.json +1 -1
- package/dist/renderer/index.d.mts +2 -2
- package/dist/renderer/index.mjs +2 -2
- package/dist/{renderer-CX4rvqm9.mjs → renderer-1-FLx8kd.mjs} +3 -3
- package/dist/{renderer-CX4rvqm9.mjs.map → renderer-1-FLx8kd.mjs.map} +1 -1
- package/dist/{renderer-BIMm7lYG.mjs → renderer-47d3etrX.mjs} +4 -4
- package/dist/{renderer-BIMm7lYG.mjs.map → renderer-47d3etrX.mjs.map} +1 -1
- package/dist/{renderer-CPtyQrJI.mjs → renderer-6GCG6JxD.mjs} +3 -3
- package/dist/{renderer-CPtyQrJI.mjs.map → renderer-6GCG6JxD.mjs.map} +1 -1
- package/dist/{renderer-BE6K88VR.mjs → renderer-8BIDdgjt.mjs} +3 -3
- package/dist/{renderer-BE6K88VR.mjs.map → renderer-8BIDdgjt.mjs.map} +1 -1
- package/dist/renderer-B-5TlncB.mjs +5 -0
- package/dist/{renderer-FgP_1OgD.mjs → renderer-B1yzSbvC.mjs} +4 -4
- package/dist/{renderer-FgP_1OgD.mjs.map → renderer-B1yzSbvC.mjs.map} +1 -1
- package/dist/{renderer-158rymL0.mjs → renderer-B2YiXpp-.mjs} +2 -2
- package/dist/{renderer-158rymL0.mjs.map → renderer-B2YiXpp-.mjs.map} +1 -1
- package/dist/{renderer-eQP0fvgc.mjs → renderer-B55ljMI_.mjs} +2 -2
- package/dist/{renderer-eQP0fvgc.mjs.map → renderer-B55ljMI_.mjs.map} +1 -1
- package/dist/{renderer-Duorbrb8.mjs → renderer-B6Tg4UgH.mjs} +4 -4
- package/dist/{renderer-Duorbrb8.mjs.map → renderer-B6Tg4UgH.mjs.map} +1 -1
- package/dist/{renderer-DmrP4dsn.mjs → renderer-BFnf-8Yt.mjs} +3 -3
- package/dist/{renderer-DmrP4dsn.mjs.map → renderer-BFnf-8Yt.mjs.map} +1 -1
- package/dist/{renderer-CLP6Lm7y.mjs → renderer-BGHHoPiD.mjs} +2 -2
- package/dist/{renderer-BO5u8eFS.mjs → renderer-BHUjPi24.mjs} +2 -2
- package/dist/{renderer-BO5u8eFS.mjs.map → renderer-BHUjPi24.mjs.map} +1 -1
- package/dist/renderer-BHXtDg5_.mjs +3 -0
- package/dist/{renderer-HPBahXjt.mjs → renderer-BIk67-jU.mjs} +2 -2
- package/dist/{renderer-HPBahXjt.mjs.map → renderer-BIk67-jU.mjs.map} +1 -1
- package/dist/{renderer-C-dcd14F.d.mts → renderer-BLEmr0Lt.d.mts} +2 -2
- package/dist/{renderer-C-dcd14F.d.mts.map → renderer-BLEmr0Lt.d.mts.map} +1 -1
- package/dist/{renderer-tYmQUp4d.mjs → renderer-BLs5sDdk.mjs} +3 -3
- package/dist/{renderer-tYmQUp4d.mjs.map → renderer-BLs5sDdk.mjs.map} +1 -1
- package/dist/renderer-BPd3gvEt.mjs +5 -0
- package/dist/{renderer-BiH29MS6.mjs → renderer-BXul0Wy6.mjs} +3 -3
- package/dist/{renderer-BiH29MS6.mjs.map → renderer-BXul0Wy6.mjs.map} +1 -1
- package/dist/{renderer-DVdRzDwX.mjs → renderer-B_1SLBPa.mjs} +3 -3
- package/dist/{renderer-DVdRzDwX.mjs.map → renderer-B_1SLBPa.mjs.map} +1 -1
- package/dist/renderer-B_ep98BH.mjs +5 -0
- package/dist/renderer-Ba_KUbKW.mjs +5 -0
- package/dist/{renderer-dX7Fy1NR.mjs → renderer-BbyNUjE_.mjs} +3 -3
- package/dist/{renderer-dX7Fy1NR.mjs.map → renderer-BbyNUjE_.mjs.map} +1 -1
- package/dist/{renderer-0n4A8P2_.mjs → renderer-BcVr_cIk.mjs} +2 -2
- package/dist/{renderer-0n4A8P2_.mjs.map → renderer-BcVr_cIk.mjs.map} +1 -1
- package/dist/renderer-BeL2hstU.mjs +5 -0
- package/dist/renderer-Bj81osPQ.mjs +5 -0
- package/dist/{renderer-ZM2jwJbX.mjs → renderer-BjL7sKGU.mjs} +3 -3
- package/dist/{renderer-ZM2jwJbX.mjs.map → renderer-BjL7sKGU.mjs.map} +1 -1
- package/dist/{renderer-Bh7d3RSt.mjs → renderer-BjNcuJ4H.mjs} +3 -3
- package/dist/{renderer-Bh7d3RSt.mjs.map → renderer-BjNcuJ4H.mjs.map} +1 -1
- package/dist/{renderer-Sdsy27LH.mjs → renderer-Br8aDmf0.mjs} +2 -2
- package/dist/renderer-BvZQngSm.mjs +5 -0
- package/dist/renderer-BxgN8oXx.mjs +5 -0
- package/dist/{renderer-BQ-pHSPI.mjs → renderer-ByOvGGzp.mjs} +3 -3
- package/dist/{renderer-BQ-pHSPI.mjs.map → renderer-ByOvGGzp.mjs.map} +1 -1
- package/dist/{renderer-KkDYCAkn.mjs → renderer-C11qLlrz.mjs} +3 -3
- package/dist/{renderer-KkDYCAkn.mjs.map → renderer-C11qLlrz.mjs.map} +1 -1
- package/dist/{renderer-D52KWsb8.mjs → renderer-C5dyPQjG.mjs} +3 -3
- package/dist/{renderer-D52KWsb8.mjs.map → renderer-C5dyPQjG.mjs.map} +1 -1
- package/dist/renderer-C5jDrTBc.mjs +5 -0
- package/dist/{renderer-DTKtkgTO.mjs → renderer-C6TbU8U5.mjs} +3 -3
- package/dist/{renderer-DTKtkgTO.mjs.map → renderer-C6TbU8U5.mjs.map} +1 -1
- package/dist/{renderer-aT6MUYPr.mjs → renderer-C9bcEaBE.mjs} +3 -3
- package/dist/{renderer-aT6MUYPr.mjs.map → renderer-C9bcEaBE.mjs.map} +1 -1
- package/dist/{renderer-CsxO_wBG.mjs → renderer-CAH00Lub.mjs} +2 -2
- package/dist/{renderer-Cb74SQHm.mjs → renderer-CAhsBEpU.mjs} +2 -2
- package/dist/{renderer-Cb74SQHm.mjs.map → renderer-CAhsBEpU.mjs.map} +1 -1
- package/dist/renderer-CBK4M82Y.mjs +5 -0
- package/dist/{renderer-CFSh2eG-.mjs → renderer-CCH0gSF7.mjs} +3 -3
- package/dist/{renderer-CFSh2eG-.mjs.map → renderer-CCH0gSF7.mjs.map} +1 -1
- package/dist/{renderer-CHvEgLHy.mjs → renderer-CCbOp0BM.mjs} +3 -3
- package/dist/{renderer-CHvEgLHy.mjs.map → renderer-CCbOp0BM.mjs.map} +1 -1
- package/dist/{renderer-DrrWvz8l.mjs → renderer-CEb5GjcU.mjs} +3 -3
- package/dist/{renderer-DrrWvz8l.mjs.map → renderer-CEb5GjcU.mjs.map} +1 -1
- package/dist/{renderer-1KfQICGK.mjs → renderer-CIL9zh-a.mjs} +3 -3
- package/dist/{renderer-1KfQICGK.mjs.map → renderer-CIL9zh-a.mjs.map} +1 -1
- package/dist/{renderer-CEvj79Wg.mjs → renderer-CIbXIFOb.mjs} +4 -4
- package/dist/{renderer-CEvj79Wg.mjs.map → renderer-CIbXIFOb.mjs.map} +1 -1
- package/dist/renderer-CLHtCctc.mjs +5 -0
- package/dist/{renderer-DxOJv_G7.mjs → renderer-CLX33fIK.mjs} +3 -3
- package/dist/{renderer-DxOJv_G7.mjs.map → renderer-CLX33fIK.mjs.map} +1 -1
- package/dist/{renderer-BcaT2j3R.mjs → renderer-CLXpWDqx.mjs} +2 -2
- package/dist/{renderer-BcaT2j3R.mjs.map → renderer-CLXpWDqx.mjs.map} +1 -1
- package/dist/renderer-CLin7MNN.mjs +5 -0
- package/dist/{renderer-COcFh5bK.mjs → renderer-CLypsmiH.mjs} +3 -3
- package/dist/{renderer-COcFh5bK.mjs.map → renderer-CLypsmiH.mjs.map} +1 -1
- package/dist/renderer-CN7TypOB.mjs +5 -0
- package/dist/renderer-CV5Jfwq7.mjs +5 -0
- package/dist/renderer-Ca5E46WK.mjs +5 -0
- package/dist/renderer-CdbOtoOU.mjs +5 -0
- package/dist/renderer-CeD_bqWj.mjs +5 -0
- package/dist/{renderer-BnpMAub0.mjs → renderer-CfEuoZ7b.mjs} +3 -3
- package/dist/{renderer-BnpMAub0.mjs.map → renderer-CfEuoZ7b.mjs.map} +1 -1
- package/dist/renderer-CfzNNUOd.mjs +5 -0
- package/dist/{renderer-0W-Ty55h.mjs → renderer-Cg3h0Mz9.mjs} +3 -3
- package/dist/{renderer-0W-Ty55h.mjs.map → renderer-Cg3h0Mz9.mjs.map} +1 -1
- package/dist/renderer-Cl8TmdU8.mjs +5 -0
- package/dist/{renderer-CoaDDIS6.mjs → renderer-ClHqvIps.mjs} +10 -10
- package/dist/renderer-ClHqvIps.mjs.map +1 -0
- package/dist/renderer-CosBP_IM.mjs +5 -0
- package/dist/renderer-CpwVs5Fh.mjs +5 -0
- package/dist/renderer-Cq7baxNb.mjs +5 -0
- package/dist/{renderer-B_Oz9L3g.mjs → renderer-CqMz_iXy.mjs} +2 -2
- package/dist/{renderer-B_Oz9L3g.mjs.map → renderer-CqMz_iXy.mjs.map} +1 -1
- package/dist/{renderer-DORydJHm.mjs → renderer-CqSmfrE1.mjs} +3 -3
- package/dist/{renderer-DORydJHm.mjs.map → renderer-CqSmfrE1.mjs.map} +1 -1
- package/dist/{renderer-WTvo3wo9.d.mts → renderer-CrhJJKFY.d.mts} +5 -3
- package/dist/renderer-CrhJJKFY.d.mts.map +1 -0
- package/dist/{renderer-Bt3F1tmP.mjs → renderer-CxxwhUwy.mjs} +3 -3
- package/dist/{renderer-Bt3F1tmP.mjs.map → renderer-CxxwhUwy.mjs.map} +1 -1
- package/dist/{renderer-Cba208C9.mjs → renderer-D24aiXmB.mjs} +3 -3
- package/dist/{renderer-Cba208C9.mjs.map → renderer-D24aiXmB.mjs.map} +1 -1
- package/dist/renderer-D6GkxwAx.mjs +5 -0
- package/dist/renderer-D7SfGdzX.mjs +5 -0
- package/dist/renderer-D7wt09_l.mjs +5 -0
- package/dist/{renderer-CdJoOfQw.mjs → renderer-DBslE7fc.mjs} +2 -2
- package/dist/{renderer-CdJoOfQw.mjs.map → renderer-DBslE7fc.mjs.map} +1 -1
- package/dist/{renderer-Df-rf7RC.mjs → renderer-DE3Ki96C.mjs} +3 -3
- package/dist/{renderer-Df-rf7RC.mjs.map → renderer-DE3Ki96C.mjs.map} +1 -1
- package/dist/{renderer-DqIrYB0P.mjs → renderer-DJCqc98W.mjs} +3 -3
- package/dist/{renderer-DqIrYB0P.mjs.map → renderer-DJCqc98W.mjs.map} +1 -1
- package/dist/{renderer-E54Vv1_W.mjs → renderer-DODOyrty.mjs} +3 -3
- package/dist/{renderer-E54Vv1_W.mjs.map → renderer-DODOyrty.mjs.map} +1 -1
- package/dist/{renderer-DuFwDHHF.mjs → renderer-DRYxcfgi.mjs} +2 -2
- package/dist/renderer-DSuDMYqY.mjs +5 -0
- package/dist/{renderer-BGDKxfsM.mjs → renderer-DYreml_A.mjs} +3 -3
- package/dist/{renderer-BGDKxfsM.mjs.map → renderer-DYreml_A.mjs.map} +1 -1
- package/dist/{renderer-BGnMRdUK.mjs → renderer-DZJnNISO.mjs} +2 -2
- package/dist/{renderer-BGnMRdUK.mjs.map → renderer-DZJnNISO.mjs.map} +1 -1
- package/dist/renderer-DaIstCIs.mjs +5 -0
- package/dist/renderer-DbOD3Nc0.mjs +5 -0
- package/dist/{renderer-B3gQT1uq.mjs → renderer-DbenSRjl.mjs} +3 -3
- package/dist/{renderer-B3gQT1uq.mjs.map → renderer-DbenSRjl.mjs.map} +1 -1
- package/dist/{renderer-DGsWlXjl.mjs → renderer-DcXxkxds.mjs} +75 -72
- package/dist/renderer-DcXxkxds.mjs.map +1 -0
- package/dist/renderer-DdRCA1bn.mjs +6 -0
- package/dist/{renderer-PDs21Gsq.mjs → renderer-DdUtL-qF.mjs} +3 -3
- package/dist/{renderer-PDs21Gsq.mjs.map → renderer-DdUtL-qF.mjs.map} +1 -1
- package/dist/renderer-DfO37haf.mjs +5 -0
- package/dist/renderer-DjZwzxZ7.mjs +5 -0
- package/dist/renderer-DnAvySNy.mjs +5 -0
- package/dist/{renderer-BwnQRuce.mjs → renderer-DnbY04Qk.mjs} +3 -3
- package/dist/{renderer-BwnQRuce.mjs.map → renderer-DnbY04Qk.mjs.map} +1 -1
- package/dist/renderer-DnvEPm5E.mjs +5 -0
- package/dist/{renderer-C_-hWBF1.mjs → renderer-Do9mW_-B.mjs} +3 -3
- package/dist/{renderer-C_-hWBF1.mjs.map → renderer-Do9mW_-B.mjs.map} +1 -1
- package/dist/{renderer-PDAlUGKG.mjs → renderer-Dqg8qxjq.mjs} +3 -3
- package/dist/{renderer-PDAlUGKG.mjs.map → renderer-Dqg8qxjq.mjs.map} +1 -1
- package/dist/{renderer-wrXFfvpJ.mjs → renderer-DvkRbmb2.mjs} +3 -3
- package/dist/{renderer-wrXFfvpJ.mjs.map → renderer-DvkRbmb2.mjs.map} +1 -1
- package/dist/renderer-DwNpKnWf.mjs +5 -0
- package/dist/{renderer-Cv6od7Be.mjs → renderer-Dw_xy3zx.mjs} +3 -3
- package/dist/{renderer-Cv6od7Be.mjs.map → renderer-Dw_xy3zx.mjs.map} +1 -1
- package/dist/renderer-Dx3Dghus.mjs +5 -0
- package/dist/{renderer-lP23pU1s.mjs → renderer-DyrNti45.mjs} +3 -3
- package/dist/{renderer-lP23pU1s.mjs.map → renderer-DyrNti45.mjs.map} +1 -1
- package/dist/renderer-KvaoEwIk.mjs +5 -0
- package/dist/{renderer-Cw7R1U43.mjs → renderer-SwUFJ4aA.mjs} +3 -3
- package/dist/{renderer-Cw7R1U43.mjs.map → renderer-SwUFJ4aA.mjs.map} +1 -1
- package/dist/{renderer-C4Jfgjm5.mjs → renderer-XEoQnDs5.mjs} +3 -3
- package/dist/{renderer-C4Jfgjm5.mjs.map → renderer-XEoQnDs5.mjs.map} +1 -1
- package/dist/{renderer-BXGr426R.mjs → renderer-Xw9Zn3pD.mjs} +2 -2
- package/dist/{renderer-BXGr426R.mjs.map → renderer-Xw9Zn3pD.mjs.map} +1 -1
- package/dist/{renderer-BEpA2g1_.mjs → renderer-ZWIDTOLV.mjs} +2 -2
- package/dist/{renderer-BEpA2g1_.mjs.map → renderer-ZWIDTOLV.mjs.map} +1 -1
- package/dist/{renderer-D36Pjp0B.mjs → renderer-bGhRdKB7.mjs} +2 -2
- package/dist/{renderer-D36Pjp0B.mjs.map → renderer-bGhRdKB7.mjs.map} +1 -1
- package/dist/{renderer-ZarULMvJ.mjs → renderer-d4weUlVq.mjs} +2 -2
- package/dist/{renderer-ZarULMvJ.mjs.map → renderer-d4weUlVq.mjs.map} +1 -1
- package/dist/{renderer-YEDoDnsE.mjs → renderer-g7CMgD1v.mjs} +3 -3
- package/dist/{renderer-YEDoDnsE.mjs.map → renderer-g7CMgD1v.mjs.map} +1 -1
- package/dist/{renderer-CZGpETnc.mjs → renderer-gjLFqdv-.mjs} +4 -4
- package/dist/{renderer-CZGpETnc.mjs.map → renderer-gjLFqdv-.mjs.map} +1 -1
- package/dist/{renderer-H-Adf8Za.mjs → renderer-gv0u9XmU.mjs} +3 -3
- package/dist/{renderer-H-Adf8Za.mjs.map → renderer-gv0u9XmU.mjs.map} +1 -1
- package/dist/{renderer-FPYVmSf6.mjs → renderer-jJWwrha1.mjs} +3 -3
- package/dist/{renderer-FPYVmSf6.mjs.map → renderer-jJWwrha1.mjs.map} +1 -1
- package/dist/{renderer-BKhdqykZ.mjs → renderer-kl_pAczD.mjs} +3 -3
- package/dist/{renderer-BKhdqykZ.mjs.map → renderer-kl_pAczD.mjs.map} +1 -1
- package/dist/{renderer-BKL3UEzN.mjs → renderer-lrKwPhZi.mjs} +2 -2
- package/dist/{renderer-BKL3UEzN.mjs.map → renderer-lrKwPhZi.mjs.map} +1 -1
- package/dist/{renderer-C2O4nK9x.mjs → renderer-pnYj1REL.mjs} +3 -3
- package/dist/{renderer-C2O4nK9x.mjs.map → renderer-pnYj1REL.mjs.map} +1 -1
- package/dist/{renderers-CP8CFWDs-CZJ7NRsl.mjs → renderers-CP8CFWDs-CDikhBRO.mjs} +3 -3
- package/dist/{renderers-CP8CFWDs-CZJ7NRsl.mjs.map → renderers-CP8CFWDs-CDikhBRO.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +6 -6
- package/dist/{signals-BrNF9l9s.mjs → signals-BeAWA_1Y.mjs} +3 -3
- package/dist/{signals-BrNF9l9s.mjs.map → signals-BeAWA_1Y.mjs.map} +1 -1
- package/dist/{src-_l81YkMD.mjs → src-LYcH_X8o.mjs} +233 -27
- package/dist/src-LYcH_X8o.mjs.map +1 -0
- package/package.json +58 -58
- package/dist/dist-D021IFfp.mjs.map +0 -1
- package/dist/dist-DSKhnhDk.mjs.map +0 -1
- package/dist/dist-cC6nOaMR.mjs.map +0 -1
- package/dist/index-3Vdef2KE.d.mts.map +0 -1
- package/dist/index-CWG19cm-.d.mts.map +0 -1
- package/dist/index-ocZc12ZS.d.mts.map +0 -1
- package/dist/preview-engine/chunk-3SR6BI4B.mjs +0 -1
- package/dist/preview-engine/chunk-5NLDETDV.mjs +0 -1974
- package/dist/preview-engine/chunk-ALSOO22Q.mjs +0 -1
- package/dist/preview-engine/chunk-NKGXINCU.mjs +0 -1
- package/dist/preview-engine/chunk-PJMX2GFY.mjs +0 -1
- package/dist/preview-engine/chunk-SIXIF5QZ.mjs +0 -3
- package/dist/preview-engine/renderers-4CRXZJ5G.mjs +0 -1
- package/dist/preview-engine/renderers-5QF4OLFQ.mjs +0 -1
- package/dist/preview-engine/renderers-5SOW6OVE.mjs +0 -1
- package/dist/preview-engine/renderers-6M2HPY2J.mjs +0 -1
- package/dist/preview-engine/renderers-7HT5NW7W.mjs +0 -1
- package/dist/preview-engine/renderers-ATTGUTYY.mjs +0 -1
- package/dist/preview-engine/renderers-AYWCRBQC.mjs +0 -1
- package/dist/preview-engine/renderers-BA6ZCPI5.mjs +0 -1
- package/dist/preview-engine/renderers-BAS7RXTC.mjs +0 -1
- package/dist/preview-engine/renderers-CZTCW4FC.mjs +0 -1
- package/dist/preview-engine/renderers-D2XEQ2YY.mjs +0 -1
- package/dist/preview-engine/renderers-DFIJYBW2.mjs +0 -1
- package/dist/preview-engine/renderers-EJN6M6DO.mjs +0 -1
- package/dist/preview-engine/renderers-EK3HQUUF.mjs +0 -1
- package/dist/preview-engine/renderers-G34C5J27.mjs +0 -1
- package/dist/preview-engine/renderers-GKVTNDVH.mjs +0 -1
- package/dist/preview-engine/renderers-HZBYQKIQ.mjs +0 -1
- package/dist/preview-engine/renderers-IK7ZJJKJ.mjs +0 -1
- package/dist/preview-engine/renderers-ISASPH6T.mjs +0 -1
- package/dist/preview-engine/renderers-IT5ISWSA.mjs +0 -228
- package/dist/preview-engine/renderers-IW5MWDBI.mjs +0 -1
- package/dist/preview-engine/renderers-K2PI4WJS.mjs +0 -1
- package/dist/preview-engine/renderers-KESHVFL2.mjs +0 -1
- package/dist/preview-engine/renderers-KTZZVAB2.mjs +0 -1
- package/dist/preview-engine/renderers-KY5CJEOV.mjs +0 -1
- package/dist/preview-engine/renderers-M5W6SUQD.mjs +0 -1
- package/dist/preview-engine/renderers-MEM3REMI.mjs +0 -1
- package/dist/preview-engine/renderers-N36R42RL.mjs +0 -1
- package/dist/preview-engine/renderers-O5XMWFPY.mjs +0 -1
- package/dist/preview-engine/renderers-QJA35PKC.mjs +0 -1
- package/dist/preview-engine/renderers-TJIFTQHV.mjs +0 -1
- package/dist/preview-engine/renderers-TN4XN436.mjs +0 -1
- package/dist/preview-engine/renderers-UDYLCYCB.mjs +0 -1
- package/dist/preview-engine/renderers-WZ7SFIBZ.mjs +0 -1
- package/dist/preview-engine/renderers-X6QNDC6R.mjs +0 -1
- package/dist/preview-engine/renderers-X6RNTJOV.mjs +0 -1
- package/dist/preview-engine/renderers-Y3N7236P.mjs +0 -1
- package/dist/preview-engine/renderers-YP3ASXIJ.mjs +0 -1
- package/dist/preview-engine/renderers-YVJAG3PD.mjs +0 -1
- package/dist/preview-engine/renderers-ZPPZNMKJ.mjs +0 -1
- package/dist/program-W4CWO2bp.mjs.map +0 -1
- package/dist/renderer-8HnHWqYj.mjs +0 -5
- package/dist/renderer-8itujues.mjs +0 -5
- package/dist/renderer-BFods-7v.mjs +0 -5
- package/dist/renderer-BbQygRwc.mjs +0 -5
- package/dist/renderer-Bq_sPaCg.mjs +0 -5
- package/dist/renderer-BrkDrvqS.mjs +0 -5
- package/dist/renderer-C1diVT5Q.mjs +0 -5
- package/dist/renderer-C8E7ajTR.mjs +0 -5
- package/dist/renderer-CAz8JW5c.mjs +0 -5
- package/dist/renderer-CKfrUdGw.mjs +0 -5
- package/dist/renderer-CL0rqBA4.mjs +0 -5
- package/dist/renderer-COyavIEv.mjs +0 -5
- package/dist/renderer-CUrShvUZ.mjs +0 -5
- package/dist/renderer-CWvJ_GaL.mjs +0 -5
- package/dist/renderer-Ck0mGIo9.mjs +0 -5
- package/dist/renderer-CoaDDIS6.mjs.map +0 -1
- package/dist/renderer-CqIXqdf0.mjs +0 -5
- package/dist/renderer-Csod6biL.mjs +0 -5
- package/dist/renderer-CueO924-.mjs +0 -5
- package/dist/renderer-D1vM4obC.mjs +0 -5
- package/dist/renderer-DB7QUt90.mjs +0 -5
- package/dist/renderer-DGsWlXjl.mjs.map +0 -1
- package/dist/renderer-DLMDnKlA.mjs +0 -6
- package/dist/renderer-DNs7yWMr.mjs +0 -5
- package/dist/renderer-DOrtuoa9.mjs +0 -5
- package/dist/renderer-D_JgOawb.mjs +0 -5
- package/dist/renderer-DdLo1uoa.mjs +0 -5
- package/dist/renderer-DeX3JEZV.mjs +0 -5
- package/dist/renderer-DfgZVACG.mjs +0 -5
- package/dist/renderer-DoYG7Pn6.mjs +0 -5
- package/dist/renderer-Jwqa-BUN.mjs +0 -5
- package/dist/renderer-WTvo3wo9.d.mts.map +0 -1
- package/dist/renderer-WyaqnVMz.mjs +0 -3
- package/dist/renderer-Z2Vs-IqP.mjs +0 -5
- package/dist/renderer-ZnyCpdWE.mjs +0 -5
- package/dist/renderer-emCnsnTH.mjs +0 -5
- package/dist/renderer-ioxa4-Dy.mjs +0 -5
- package/dist/renderer-iyIwrDWO.mjs +0 -5
- package/dist/renderer-tuudA_RZ.mjs +0 -5
- package/dist/renderer-yyn8S821.mjs +0 -5
- package/dist/src-_l81YkMD.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { $t as mediaSourceRange, Fn as updateClockSignals, Jt as isSignal, Pt as getActiveMediaMetadata, Qt as mediaSourceIsHold, Rt as getMediaType, _n as resolveMediaMimeType, p as DEFAULT_DURATION_MS, tn as mediaSourceTime } from "./dist-BRXsfWKQ.mjs";
|
|
2
2
|
import { d as webgpuRegistry, t as audioRegistry } from "./renderer-BgmO1Dzw.mjs";
|
|
3
|
-
import { A as emojiGraphemes, C as drawGifNode, D as drawSignalNode, E as drawParagraphNode, I as getRegisteredFontSource, In as signalRegistry, O as drawSvgNode, P as getHeadlessFontPath, S as drawCaptionNode, T as drawLottieNode, ct as resolveMediaSourceUrl, et as registerHeadlessFont, k as drawVideoNode, m as SlugGeometry, p as SlugFontCache, rt as shaderStore, st as GetFontAssetUrl, w as drawImageNode, z as inputStore } from "./dist-
|
|
3
|
+
import { A as emojiGraphemes, C as drawGifNode, D as drawSignalNode, E as drawParagraphNode, I as getRegisteredFontSource, In as signalRegistry, O as drawSvgNode, P as getHeadlessFontPath, S as drawCaptionNode, T as drawLottieNode, ct as resolveMediaSourceUrl, et as registerHeadlessFont, k as drawVideoNode, m as SlugGeometry, p as SlugFontCache, rt as shaderStore, st as GetFontAssetUrl, w as drawImageNode, z as inputStore } from "./dist-BHTd-EC1.mjs";
|
|
4
4
|
import { AudioSampleSink } from "mediabunny";
|
|
5
5
|
|
|
6
6
|
//#region ../renderers/dist/index.mjs
|
|
@@ -842,11 +842,11 @@ async function drawCompositionTree(ctx, encoder, targetView, targetTexture, targ
|
|
|
842
842
|
} else if (mediaType === "Video") {
|
|
843
843
|
const finalPlaybackRate = Math.max(.01, (Number(props.playbackRateOverride) || 1) * (Number(params.speed) || 1));
|
|
844
844
|
const effectiveTrimSec = Math.max(0, (Number(props.trimStartOverride) || 0) + (Number(params.trimStartSec) || 0) + accumulatedSeekOffsetSec);
|
|
845
|
-
const rawTimestampSec = segmentLocalFrame / fps * finalPlaybackRate + effectiveTrimSec;
|
|
845
|
+
const rawTimestampSec = props.sourceTimeSec ?? segmentLocalFrame / fps * finalPlaybackRate + effectiveTrimSec;
|
|
846
846
|
const timestampSec = Math.max(0, Number.isFinite(rawTimestampSec) ? rawTimestampSec : 0);
|
|
847
847
|
await drawVideoNode(ctx, pass, {
|
|
848
848
|
nodeId: props.renderId,
|
|
849
|
-
frameKey: `${props.renderId ?? "video"}-${params.sourceUrl}-${
|
|
849
|
+
frameKey: `${props.renderId ?? "video"}-${params.sourceUrl}-${timestampSec}`,
|
|
850
850
|
sourceUrl: params.sourceUrl,
|
|
851
851
|
timestampSec,
|
|
852
852
|
dstRect: {
|
|
@@ -1258,6 +1258,21 @@ async function decodeAudioRange(url, range) {
|
|
|
1258
1258
|
return null;
|
|
1259
1259
|
}
|
|
1260
1260
|
}
|
|
1261
|
+
/** Samples the mapped source at the audio clock; holds are silent. */
|
|
1262
|
+
async function resampleMappedPCM(input, sourceRate, outputRate, length, inputStart, map, startFrame, fps) {
|
|
1263
|
+
const output = new Float32Array(length);
|
|
1264
|
+
for (let i = 0; i < length; i++) {
|
|
1265
|
+
if (i > 0 && i % 1e5 === 0) await yieldToMain();
|
|
1266
|
+
const frame = startFrame + i / outputRate * fps;
|
|
1267
|
+
if (mediaSourceIsHold(map, frame)) continue;
|
|
1268
|
+
const position = mediaSourceTime(map, frame, fps) * sourceRate - inputStart;
|
|
1269
|
+
const index = Math.floor(position);
|
|
1270
|
+
if (index < 0 || index >= input.length) continue;
|
|
1271
|
+
const a = input[index];
|
|
1272
|
+
output[i] = a + ((input[index + 1] ?? a) - a) * (position - index);
|
|
1273
|
+
}
|
|
1274
|
+
return output;
|
|
1275
|
+
}
|
|
1261
1276
|
/**
|
|
1262
1277
|
* Resamples a PCM buffer using linear interpolation to target sample rate & speed.
|
|
1263
1278
|
* `trimOffsetSamples` is a whole-file index; `inputStartIndex` is the
|
|
@@ -1351,10 +1366,10 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1351
1366
|
mediaLogger.debug(`[AudioExtractor] Composition total duration: ${durationMs}ms (${totalDurationSec}s). Total mixed samples to allocate: ${totalTargetSamples}`);
|
|
1352
1367
|
const decodedCache = /* @__PURE__ */ new Map();
|
|
1353
1368
|
const undecodable = /* @__PURE__ */ new Set();
|
|
1354
|
-
async function getDecodedRange(url, startSec, endSec) {
|
|
1369
|
+
async function getDecodedRange(url, startSec, endSec, cache$1 = true) {
|
|
1355
1370
|
if (undecodable.has(url)) return null;
|
|
1356
1371
|
let ranges = decodedCache.get(url);
|
|
1357
|
-
const hit = ranges?.find((r) => r.validFromSec <= startSec && r.validToSec >= endSec);
|
|
1372
|
+
const hit = cache$1 ? ranges?.find((r) => r.validFromSec <= startSec && r.validToSec >= endSec) : void 0;
|
|
1358
1373
|
if (hit) return hit;
|
|
1359
1374
|
const decoded = await decodeAudioRange(url, {
|
|
1360
1375
|
startSec,
|
|
@@ -1364,6 +1379,7 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1364
1379
|
undecodable.add(url);
|
|
1365
1380
|
return null;
|
|
1366
1381
|
}
|
|
1382
|
+
if (!cache$1) return decoded;
|
|
1367
1383
|
if (!ranges) {
|
|
1368
1384
|
ranges = [];
|
|
1369
1385
|
decodedCache.set(url, ranges);
|
|
@@ -1371,6 +1387,26 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1371
1387
|
ranges.push(decoded);
|
|
1372
1388
|
return decoded;
|
|
1373
1389
|
}
|
|
1390
|
+
async function mappedChannels(url, length, map, startFrame) {
|
|
1391
|
+
const left = new Float32Array(length), right = new Float32Array(length);
|
|
1392
|
+
for (let offset = 0; offset < length;) {
|
|
1393
|
+
let count = Math.min(length - offset, targetSampleRate * 2);
|
|
1394
|
+
const first = startFrame + offset / targetSampleRate * fps;
|
|
1395
|
+
let range = mediaSourceRange(map, first, first + (count - 1) / targetSampleRate * fps, fps);
|
|
1396
|
+
while (range.max - range.min > 3 && count > 1) {
|
|
1397
|
+
count = Math.max(1, Math.floor(count / 2));
|
|
1398
|
+
range = mediaSourceRange(map, first, first + (count - 1) / targetSampleRate * fps, fps);
|
|
1399
|
+
}
|
|
1400
|
+
const decoded = await getDecodedRange(url, range.min, range.max + RANGE_MARGIN_SEC, false);
|
|
1401
|
+
if (!decoded) return null;
|
|
1402
|
+
const a = await resampleMappedPCM(decoded.channels[0], decoded.sampleRate, targetSampleRate, count, decoded.startIndex, map, first, fps);
|
|
1403
|
+
const b = decoded.channels.length > 1 ? await resampleMappedPCM(decoded.channels[1], decoded.sampleRate, targetSampleRate, count, decoded.startIndex, map, first, fps) : a;
|
|
1404
|
+
left.set(a, offset);
|
|
1405
|
+
right.set(b, offset);
|
|
1406
|
+
offset += count;
|
|
1407
|
+
}
|
|
1408
|
+
return [left, right];
|
|
1409
|
+
}
|
|
1374
1410
|
const audibleCache = /* @__PURE__ */ new WeakMap();
|
|
1375
1411
|
function isAudible(node) {
|
|
1376
1412
|
const cached = audibleCache.get(node);
|
|
@@ -1385,18 +1421,18 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1385
1421
|
audibleCache.set(node, audible);
|
|
1386
1422
|
return audible;
|
|
1387
1423
|
}
|
|
1388
|
-
async function traverse(node, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, inheritedDurationFrames) {
|
|
1424
|
+
async function traverse(node, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, inheritedDurationFrames, inheritedRemap) {
|
|
1389
1425
|
if (!node || !isAudible(node)) return null;
|
|
1390
1426
|
const op = node.operation;
|
|
1391
1427
|
if (!op) {
|
|
1392
1428
|
const durationMs$1 = getActiveMediaMetadata(node)?.durationMs ?? 0;
|
|
1393
1429
|
const durationFrames = Math.round(durationMs$1 / 1e3 * fps);
|
|
1394
|
-
const actualDurationFrames = inheritedDurationFrames !== null ? durationFrames > 0 ? Math.min(inheritedDurationFrames, durationFrames) : inheritedDurationFrames : durationFrames;
|
|
1430
|
+
const actualDurationFrames = inheritedRemap && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? durationFrames > 0 ? Math.min(inheritedDurationFrames, durationFrames) : inheritedDurationFrames : durationFrames;
|
|
1395
1431
|
const localSamplesCount$1 = Math.ceil(actualDurationFrames / fps * targetSampleRate);
|
|
1396
1432
|
if (localSamplesCount$1 <= 0) return null;
|
|
1397
1433
|
const bus$1 = new MixBus(localSamplesCount$1);
|
|
1398
1434
|
for (const child of node.children) {
|
|
1399
|
-
const childChannels = await traverse(child, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, actualDurationFrames);
|
|
1435
|
+
const childChannels = await traverse(child, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, actualDurationFrames, inheritedRemap);
|
|
1400
1436
|
if (childChannels) {
|
|
1401
1437
|
const childOp = child.operation;
|
|
1402
1438
|
const childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;
|
|
@@ -1408,13 +1444,22 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1408
1444
|
}
|
|
1409
1445
|
const volume = inheritedVolume * (op.volume ?? 1) * (op.opacity === 0 ? 0 : 1) * (op.muted ? 0 : 1);
|
|
1410
1446
|
const speedMultiplier = inheritedSpeed;
|
|
1411
|
-
const
|
|
1447
|
+
const nodeStartFrame = op.startFrame ?? op.timeline?.startFrame ?? 0;
|
|
1448
|
+
const ownRemap = op.timeRemap;
|
|
1449
|
+
const remap = ownRemap ? {
|
|
1450
|
+
map: ownRemap,
|
|
1451
|
+
offsetFrames: 0
|
|
1452
|
+
} : inheritedRemap ? {
|
|
1453
|
+
map: inheritedRemap.map,
|
|
1454
|
+
offsetFrames: inheritedRemap.offsetFrames + nodeStartFrame
|
|
1455
|
+
} : void 0;
|
|
1456
|
+
const localClockFrames = op.op === "CompositorLayer" ? nodeStartFrame : inheritedClockFrames + nodeStartFrame;
|
|
1412
1457
|
const segments = op.timeline?.segments || [];
|
|
1413
1458
|
const layer = op;
|
|
1414
1459
|
const layerTrimSec = layer.op === "CompositorLayer" ? (layer.mediaStartFrame ?? layer.trimStartFrames ?? null) !== null ? (layer.mediaStartFrame ?? layer.trimStartFrames ?? 0) / fps : Math.round((layer.trimStartSec ?? 0) * fps) / fps : 0;
|
|
1415
1460
|
const nodeDurationMs = getActiveMediaMetadata(node)?.durationMs ?? 0;
|
|
1416
1461
|
const nodeDurationFrames = Math.round(nodeDurationMs / 1e3 * fps);
|
|
1417
|
-
const nodeActualDurationFrames = inheritedDurationFrames !== null ? nodeDurationFrames > 0 ? Math.min(inheritedDurationFrames, nodeDurationFrames) : inheritedDurationFrames : nodeDurationFrames;
|
|
1462
|
+
const nodeActualDurationFrames = inheritedRemap && !ownRemap && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? nodeDurationFrames > 0 ? Math.min(inheritedDurationFrames, nodeDurationFrames) : inheritedDurationFrames : nodeDurationFrames;
|
|
1418
1463
|
const localSamplesCount = Math.ceil(nodeActualDurationFrames / fps * targetSampleRate);
|
|
1419
1464
|
if (localSamplesCount <= 0) return null;
|
|
1420
1465
|
const bus = new MixBus(localSamplesCount);
|
|
@@ -1425,7 +1470,7 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1425
1470
|
let segDurationFrames = 0;
|
|
1426
1471
|
if (seg) segDurationFrames = Math.max(1, Math.round(((seg.endSec ?? 0) - seg.startSec) * fps));
|
|
1427
1472
|
else segDurationFrames = nodeDurationFrames;
|
|
1428
|
-
const actualDurationFrames = inheritedDurationFrames !== null ? Math.min(inheritedDurationFrames, segDurationFrames) : segDurationFrames;
|
|
1473
|
+
const actualDurationFrames = inheritedRemap && !ownRemap && !seg && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? Math.min(inheritedDurationFrames, segDurationFrames) : segDurationFrames;
|
|
1429
1474
|
const segmentStartSample = Math.round(windowStartFrameOffset / fps * targetSampleRate);
|
|
1430
1475
|
if (op.op === "source") {
|
|
1431
1476
|
const mediaType = getMediaType(node);
|
|
@@ -1435,11 +1480,17 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1435
1480
|
const effectiveTrimSec = Math.max(0, (Number(params.trimStartSec) || 0) + totalSeekSec);
|
|
1436
1481
|
const clipDurationSec = actualDurationFrames / fps;
|
|
1437
1482
|
const clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));
|
|
1438
|
-
const
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1483
|
+
const mapped = remap && clipSamplesCount > 0 ? await mappedChannels(params.sourceUrl, clipSamplesCount, remap.map, remap.offsetFrames + windowStartFrameOffset) : null;
|
|
1484
|
+
const decoded = !remap && clipSamplesCount > 0 && segmentStartSample < localSamplesCount ? await getDecodedRange(params.sourceUrl, effectiveTrimSec, effectiveTrimSec + clipSamplesCount / targetSampleRate * finalSpeed + RANGE_MARGIN_SEC) : null;
|
|
1485
|
+
if (mapped || decoded) {
|
|
1486
|
+
let stretchedLeft;
|
|
1487
|
+
let stretchedRight;
|
|
1488
|
+
if (mapped) [stretchedLeft, stretchedRight] = mapped;
|
|
1489
|
+
else if (decoded) {
|
|
1490
|
+
const trimOffsetSamples = Math.round(effectiveTrimSec * decoded.sampleRate);
|
|
1491
|
+
stretchedLeft = await resampleAndStretchPCM(decoded.channels[0], decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples, decoded.startIndex);
|
|
1492
|
+
stretchedRight = decoded.channels.length > 1 ? await resampleAndStretchPCM(decoded.channels[1], decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples, decoded.startIndex) : stretchedLeft;
|
|
1493
|
+
} else throw new Error("No decoded audio");
|
|
1443
1494
|
const stretched = [stretchedLeft, stretchedRight];
|
|
1444
1495
|
if (bus.canAdopt(stretched, segmentStartSample)) {
|
|
1445
1496
|
if (volume !== 1) {
|
|
@@ -1468,11 +1519,12 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1468
1519
|
}
|
|
1469
1520
|
}
|
|
1470
1521
|
if (node.children) for (const child of node.children) {
|
|
1471
|
-
const childChannels = await traverse(child, totalSeekSec, totalClockFrames, volume, speedMultiplier, actualDurationFrames);
|
|
1522
|
+
const childChannels = await traverse(child, totalSeekSec, totalClockFrames, volume, speedMultiplier, actualDurationFrames, remap);
|
|
1472
1523
|
if (childChannels) {
|
|
1473
1524
|
const childOp = child.operation;
|
|
1474
1525
|
const childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;
|
|
1475
|
-
const
|
|
1526
|
+
const relativeStartFrame = op.op === "CompositorLayer" && childOp?.op === "CompositorLayer" ? childStartFrame - nodeStartFrame : childStartFrame;
|
|
1527
|
+
const childStartSample = Math.round(relativeStartFrame / fps * targetSampleRate);
|
|
1476
1528
|
bus.add(childChannels, segmentStartSample + childStartSample);
|
|
1477
1529
|
}
|
|
1478
1530
|
}
|
|
@@ -1551,7 +1603,49 @@ async function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device
|
|
|
1551
1603
|
sampleRate: targetSampleRate
|
|
1552
1604
|
};
|
|
1553
1605
|
}
|
|
1606
|
+
/** Resolve the source bound to a compositor layer, including effect wrappers. */
|
|
1607
|
+
function sourceOf(node) {
|
|
1608
|
+
if (node.operation?.op === "source") return computeRenderParams(node).sourceUrl;
|
|
1609
|
+
for (const child of node.children ?? []) {
|
|
1610
|
+
const source = sourceOf(child);
|
|
1611
|
+
if (source) return source;
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1614
|
+
/** Verify mapped source intervals before decoding or mixing. */
|
|
1615
|
+
async function preflightMediaTime(root, fps) {
|
|
1616
|
+
const walk = async (node) => {
|
|
1617
|
+
const op = node.operation;
|
|
1618
|
+
if (op?.op === "CompositorLayer" && op.timeRemap && op.durationFrames) {
|
|
1619
|
+
const source = sourceOf(node);
|
|
1620
|
+
if (!source) throw new Error(`Time remap on '${op.id}' has no media source`);
|
|
1621
|
+
const bounds = [];
|
|
1622
|
+
const input = await inputStore.acquire(source);
|
|
1623
|
+
try {
|
|
1624
|
+
const video = op.dataType === "Video" ? await input.getPrimaryVideoTrack() : null;
|
|
1625
|
+
const audio = op.dataType === "Video" && (op.muted || op.volume === 0) ? null : await input.getPrimaryAudioTrack();
|
|
1626
|
+
if (op.dataType === "Video" && !video) throw new Error(`Time remap on '${op.id}': source has no video track`);
|
|
1627
|
+
if (op.dataType === "Audio" && !audio) throw new Error(`Time remap on '${op.id}': source has no audio track`);
|
|
1628
|
+
for (const track of [video, audio]) {
|
|
1629
|
+
if (!track) continue;
|
|
1630
|
+
bounds.push({
|
|
1631
|
+
first: await input.getFirstTimestamp([track]),
|
|
1632
|
+
last: await track.computeDuration()
|
|
1633
|
+
});
|
|
1634
|
+
}
|
|
1635
|
+
} finally {
|
|
1636
|
+
inputStore.release(source);
|
|
1637
|
+
}
|
|
1638
|
+
const check = (range) => {
|
|
1639
|
+
for (const { first, last } of bounds) if (range.min < first - 1e-8 || range.max > last + 1e-8 || range.maxIncluded && range.max >= last - 1e-8) throw new Error(`Time remap on '${op.id}' requests source ${range.min.toFixed(6)}–${range.max.toFixed(6)}s outside ${first.toFixed(6)}–${last.toFixed(6)}s`);
|
|
1640
|
+
};
|
|
1641
|
+
if (op.timeRemap.kind === "recorded") op.timeRemap.recorder.checkRange(check);
|
|
1642
|
+
else check(mediaSourceRange(op.timeRemap, 0, op.durationFrames, fps));
|
|
1643
|
+
}
|
|
1644
|
+
for (const child of node.children ?? []) await walk(child);
|
|
1645
|
+
};
|
|
1646
|
+
await walk(root);
|
|
1647
|
+
}
|
|
1554
1648
|
|
|
1555
1649
|
//#endregion
|
|
1556
|
-
export {
|
|
1557
|
-
//# sourceMappingURL=dist-
|
|
1650
|
+
export { requiresIsolation as _, preflightMediaTime as a, bezier as c, mapBlendModeToSkia as d, measureSpring as f, preloadFont as g, preloadCompositionFonts as h, mixAudioTracks as i, computeStrokeRect as l, measureTextAsync as m, decodeAudioSource as n, resolveLayerDuration as o, measureText as p, drawCompositionTree as r, Easing as s, compositionStateStore as t, interpolate as u, spring as v, springCalculation as y };
|
|
1651
|
+
//# sourceMappingURL=dist-BM0ilHvQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dist-BM0ilHvQ.mjs","names":["cache"],"sources":["../../renderers/dist/index.mjs","../../compositions/dist/layer-logic-C4ls-aB4.mjs","../../compositions/dist/index.mjs"],"sourcesContent":["import { SlugFontCache, SlugGeometry, emojiGraphemes, getHeadlessFontPath, getRegisteredFontSource, registerHeadlessFont } from \"@framefields/webgpu-renderers\";\nimport { GetFontAssetUrl } from \"@framefields/client-utils\";\n\nexport * from \"@framefields/webgpu-renderers/math3d\"\n\n//#region src/blend.ts\nconst mapBlendModeToSkia = (mode) => {\n\tif (!mode) return \"srcOver\";\n\tswitch (mode) {\n\t\tcase \"source-over\": return \"srcOver\";\n\t\tcase \"source-in\": return \"srcIn\";\n\t\tcase \"source-out\": return \"srcOut\";\n\t\tcase \"source-atop\": return \"srcATop\";\n\t\tcase \"destination-over\": return \"dstOver\";\n\t\tcase \"destination-in\": return \"dstIn\";\n\t\tcase \"destination-out\": return \"dstOut\";\n\t\tcase \"destination-atop\": return \"dstATop\";\n\t\tcase \"copy\": return \"src\";\n\t\tcase \"xor\": return \"xor\";\n\t\tcase \"multiply\": return \"multiply\";\n\t\tcase \"screen\": return \"screen\";\n\t\tcase \"overlay\": return \"overlay\";\n\t\tcase \"darken\": return \"darken\";\n\t\tcase \"lighten\":\n\t\tcase \"lighter\": return \"lighten\";\n\t\tcase \"color-dodge\": return \"colorDodge\";\n\t\tcase \"color-burn\": return \"colorBurn\";\n\t\tcase \"hard-light\": return \"hardLight\";\n\t\tcase \"soft-light\": return \"softLight\";\n\t\tcase \"difference\": return \"difference\";\n\t\tcase \"exclusion\": return \"exclusion\";\n\t\tcase \"hue\": return \"hue\";\n\t\tcase \"saturation\": return \"saturation\";\n\t\tcase \"color\": return \"color\";\n\t\tcase \"luminosity\": return \"luminosity\";\n\t\tdefault: return \"srcOver\";\n\t}\n};\nconst requiresIsolation = (mode) => {\n\treturn mode === \"destination-in\" || mode === \"source-in\";\n};\n\n//#endregion\n//#region src/geometry.ts\nfunction computeStrokeRect(w, h, cornerRadius, strokeWidth, align = \"outside\") {\n\tif (align === \"inside\") {\n\t\tconst half = strokeWidth / 2;\n\t\treturn {\n\t\t\tx: half,\n\t\t\ty: half,\n\t\t\twidth: Math.max(0, w - strokeWidth),\n\t\t\theight: Math.max(0, h - strokeWidth),\n\t\t\tradius: cornerRadius === 0 ? 0 : Math.max(0, cornerRadius - half)\n\t\t};\n\t}\n\tif (align === \"outside\") {\n\t\tconst half = strokeWidth / 2;\n\t\treturn {\n\t\t\tx: -half,\n\t\t\ty: -half,\n\t\t\twidth: w + strokeWidth,\n\t\t\theight: h + strokeWidth,\n\t\t\tradius: cornerRadius === 0 ? 0 : cornerRadius + half\n\t\t};\n\t}\n\treturn {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: w,\n\t\theight: h,\n\t\tradius: cornerRadius\n\t};\n}\n\n//#endregion\n//#region src/interpolate.ts\nconst { cbrt, sqrt, PI: π } = Math;\nconst x2t = (x, a, b, c, d) => {\n\tconst q = a + b * x;\n\tconst s = q ** 2 + c;\n\tif (s > 0) {\n\t\tconst root = sqrt(s);\n\t\treturn cbrt(q + root) + cbrt(q - root) - d;\n\t}\n\tconst l = cbrt(sqrt(q * q - s));\n\tconst angle = q ? Math.atan(sqrt(-s) / q) : -π / 2;\n\tlet φ;\n\tif (b < 0) φ = (q > 0 ? 2 * π : π) - angle;\n\telse if (d < 0) φ = (q > 0 ? 2 * π : -3 * π) + angle;\n\telse φ = (q > 0 ? 0 : π) + angle;\n\treturn 2 * l * Math.cos(φ / 3) - d;\n};\nconst Y = (t, ay, by, cy) => ((ay * t + 3 * by) * t + cy) * t;\nconst linearEasing = (x) => x;\nfunction bezier(mX1, mY1, mX2, mY2) {\n\tif (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) throw new Error(\"bezier x values must be in [0, 1] range\");\n\tif (mX1 === mY1 && mX2 === mY2) return linearEasing;\n\tconst a = 6 * (3 * mX1 - 3 * mX2 + 1);\n\tconst b = 6 * (mX2 - 2 * mX1);\n\tconst c = 3 * mX1;\n\tconst a2 = a * a;\n\tconst b2 = b * b;\n\tconst d = b / a;\n\tconst e = 3 * b * c / a2 - b2 * b / (a2 * a);\n\tconst w1 = 2 * c / a - b2 / a2;\n\tconst w = w1 * w1 * w1;\n\tconst o = 3 / a;\n\tconst ay = 3 * mY1 - 3 * mY2 + 1;\n\tconst by = mY2 - 2 * mY1;\n\tconst cy = 3 * mY1;\n\tconst X2T = a ? x2t : linearEasing;\n\treturn function BezierEasing(x) {\n\t\tif (x === 0 || x === 1) return x;\n\t\treturn Y(X2T(x, e, o, w, d), ay, by, cy);\n\t};\n}\nconst Easing = {\n\tlinear: linearEasing,\n\tease: bezier(.25, .1, .25, 1),\n\tquad: (t) => t * t,\n\tcubic: (t) => t * t * t,\n\tpoly: (n) => (t) => t ** n,\n\tsin: (t) => 1 - Math.cos(t * Math.PI / 2),\n\tcircle: (t) => 1 - Math.sqrt(1 - t * t),\n\texp: (t) => 2 ** (10 * (t - 1)),\n\telastic: (bounciness = 1) => {\n\t\tconst p = bounciness * Math.PI;\n\t\treturn (t) => 1 - Math.cos(t * Math.PI / 2) ** 3 * Math.cos(t * p);\n\t},\n\tback: (s = 1.70158) => (t) => t * t * ((s + 1) * t - s),\n\tbounce: (t) => {\n\t\tif (t < 1 / 2.75) return 7.5625 * t * t;\n\t\tif (t < 2 / 2.75) {\n\t\t\tconst t2$1 = t - 1.5 / 2.75;\n\t\t\treturn 7.5625 * t2$1 * t2$1 + .75;\n\t\t}\n\t\tif (t < 2.5 / 2.75) {\n\t\t\tconst t2$1 = t - 2.25 / 2.75;\n\t\t\treturn 7.5625 * t2$1 * t2$1 + .9375;\n\t\t}\n\t\tconst t2 = t - 2.625 / 2.75;\n\t\treturn 7.5625 * t2 * t2 + .984375;\n\t},\n\tbezier,\n\tin: (fn) => fn,\n\tout: (fn) => (t) => 1 - fn(1 - t),\n\tinOut: (fn) => (t) => t < .5 ? fn(t * 2) / 2 : 1 - fn((1 - t) * 2) / 2\n};\nfunction interpolate(value, inputRange, outputRange, options) {\n\tconst extrapolateLeft = options?.extrapolateLeft ?? \"extend\";\n\tconst extrapolateRight = options?.extrapolateRight ?? \"extend\";\n\tif (inputRange.length !== outputRange.length) throw new Error(\"inputRange and outputRange must have the same length\");\n\tif (inputRange.length < 2) throw new Error(\"inputRange must have at least 2 elements\");\n\tconst firstInput = inputRange[0];\n\tconst lastInput = inputRange[inputRange.length - 1];\n\tif (value < firstInput) {\n\t\tif (extrapolateLeft === \"clamp\") return outputRange[0];\n\t\tif (extrapolateLeft === \"identity\") return value;\n\t}\n\tif (value > lastInput) {\n\t\tif (extrapolateRight === \"clamp\") return outputRange[outputRange.length - 1];\n\t\tif (extrapolateRight === \"identity\") return value;\n\t}\n\tlet i = 1;\n\tfor (; i < inputRange.length - 1; i++) if (value < inputRange[i]) break;\n\tconst x0 = inputRange[i - 1];\n\tconst x1 = inputRange[i];\n\tconst y0 = outputRange[i - 1];\n\tconst y1 = outputRange[i];\n\tif (x0 === x1) return y0;\n\tlet progress = (value - x0) / (x1 - x0);\n\tif (options?.easing) progress = options.easing(progress);\n\treturn y0 + progress * (y1 - y0);\n}\n\n//#endregion\n//#region src/font-source.ts\n/**\n* Where a family's font loads from: the file, URL or bytes it was registered\n* with (`FontManager.register`), else the `assets/fonts/<Family>.ttf`\n* naming convention, which would miss e.g. \"Foo-Regular.ttf\" or bytes.\n*/\nfunction fontSource(family) {\n\treturn getRegisteredFontSource(family) ?? getHeadlessFontPath(family) ?? GetFontAssetUrl(family);\n}\n/** {@link fontSource} as a URL or path, for loaders that only take one. */\nfunction fontUrl(family) {\n\tconst source = fontSource(family);\n\treturn typeof source === \"string\" ? source : GetFontAssetUrl(family);\n}\n\n//#endregion\n//#region src/utils.ts\n/**\n* Preloads a font into the browser or headless environment.\n*/\nasync function preloadFont(family, source) {\n\tif (typeof window !== \"undefined\" && typeof FontFace !== \"undefined\") {\n\t\tconst from = typeof source === \"string\" ? source : \"its registered bytes\";\n\t\ttry {\n\t\t\tconst loadedFace = await new FontFace(family, typeof source === \"string\" ? `url(${source})` : source).load();\n\t\t\tdocument.fonts.add(loadedFace);\n\t\t\tawait document.fonts.ready;\n\t\t} catch (e) {\n\t\t\tconsole.warn(`[preloadFont] Failed to load font \"${family}\" from ${from}:`, e);\n\t\t}\n\t} else if (typeof source === \"string\") await registerHeadlessFont(family, source);\n}\n\n//#endregion\n//#region src/preload-fonts.ts\nlet warnedNoEmojiFont = false;\n/**\n* Loads every font a composition's text uses (for layout and for drawing) and\n* the emoji it draws. The browser preview and the export both call this, so\n* they start each render from the same glyphs.\n*/\nasync function preloadCompositionFonts(media, device, onError = (err, what) => console.warn(`[framefields] ${what}`, err)) {\n\tconst families = /* @__PURE__ */ new Set();\n\tconst emoji = /* @__PURE__ */ new Map();\n\t(function walk(node) {\n\t\tconst op = node.operation;\n\t\tif (op) {\n\t\t\tconst isText = op.op === \"text\" || op.kind === \"text\" || op.op === \"caption\" || op.kind === \"caption\" || typeof op.text === \"string\";\n\t\t\tconst family = op.fontFamily || (isText ? \"Inter\" : \"\");\n\t\t\tif (family) families.add(family);\n\t\t\tif (isText && typeof op.text === \"string\") {\n\t\t\t\tconst fontSize = op.fontSize ?? 48;\n\t\t\t\tfor (const char of emojiGraphemes(op.text)) emoji.set(`${char}-${fontSize}`, fontSize);\n\t\t\t}\n\t\t}\n\t\tfor (const child of node.children ?? []) walk(child);\n\t})(media);\n\tconst tasks = [];\n\tfor (const family of families) {\n\t\tconst source = fontSource(family);\n\t\tconst url = fontUrl(family);\n\t\tconst from = typeof source === \"string\" ? source : \"its registered bytes\";\n\t\ttasks.push(preloadFont(family, source).catch((err) => onError(err, `font \"${family}\" from ${from}`)));\n\t\tif (device) tasks.push(SlugFontCache.preloadSlugFont(device, family, url).catch((err) => onError(err, `Slug font \"${family}\" from ${url}`)));\n\t}\n\tif (device && emoji.size > 0) {\n\t\tif (!SlugFontCache.hasEmojiFont() && !warnedNoEmojiFont) {\n\t\t\twarnedNoEmojiFont = true;\n\t\t\tconsole.warn(\"[framefields] Text uses emoji but no emoji font is registered, so exports draw nothing for them. Run `npx framefields fonts add emoji` and call the generated `registerFonts()`, or register a color emoji font (e.g. Noto Color Emoji) with FontManager.registerEmojiFont(path). `comp.lint()` names the layers (missing_emoji_font).\");\n\t\t}\n\t\tfor (const [key, fontSize] of emoji) {\n\t\t\tconst char = key.slice(0, key.lastIndexOf(\"-\"));\n\t\t\ttasks.push(SlugFontCache.preloadEmoji(device, char, fontSize).catch((err) => {\n\t\t\t\tif (SlugFontCache.hasEmojiFont()) onError(err, `emoji \"${char}\"`);\n\t\t\t}));\n\t\t}\n\t}\n\tawait Promise.all(tasks);\n}\n\n//#endregion\n//#region src/spring.ts\nconst defaultSpringConfig = {\n\tdamping: 10,\n\tmass: 1,\n\tstiffness: 100,\n\tovershootClamping: false\n};\nconst advanceCache = {};\nfunction advance({ animation, now, config }) {\n\tconst { toValue, lastTimestamp, current, velocity } = animation;\n\tconst deltaTime = Math.min(now - lastTimestamp, 64);\n\tif (config.damping <= 0) throw new Error(\"Spring damping must be greater than 0, otherwise the spring() animation will never end, causing an infinite loop.\");\n\tif (config.stiffness <= 0) throw new Error(\"Spring stiffness must be greater than 0.\");\n\tif (config.mass <= 0) throw new Error(\"Spring mass must be greater than 0.\");\n\tconst c = config.damping;\n\tconst m = config.mass;\n\tconst k = config.stiffness;\n\tconst cacheKey = [\n\t\ttoValue,\n\t\tlastTimestamp,\n\t\tcurrent,\n\t\tvelocity,\n\t\tc,\n\t\tm,\n\t\tk,\n\t\tnow\n\t].join(\"-\");\n\tif (advanceCache[cacheKey]) return advanceCache[cacheKey];\n\tconst v0 = -velocity;\n\tconst x0 = toValue - current;\n\tconst zeta = c / (2 * Math.sqrt(k * m));\n\tconst omega0 = Math.sqrt(k / m);\n\tconst omega1 = omega0 * Math.sqrt(1 - zeta ** 2);\n\tconst t = deltaTime / 1e3;\n\tconst sin1 = Math.sin(omega1 * t);\n\tconst cos1 = Math.cos(omega1 * t);\n\tconst underDampedEnvelope = Math.exp(-zeta * omega0 * t);\n\tconst underDampedFrag1 = underDampedEnvelope * (sin1 * ((v0 + zeta * omega0 * x0) / omega1) + x0 * cos1);\n\tconst underDampedPosition = toValue - underDampedFrag1;\n\tconst underDampedVelocity = zeta * omega0 * underDampedFrag1 - underDampedEnvelope * (cos1 * (v0 + zeta * omega0 * x0) - omega1 * x0 * sin1);\n\tconst criticallyDampedEnvelope = Math.exp(-omega0 * t);\n\tconst criticallyDampedPosition = toValue - criticallyDampedEnvelope * (x0 + (v0 + omega0 * x0) * t);\n\tconst criticallyDampedVelocity = criticallyDampedEnvelope * (v0 * (t * omega0 - 1) + t * x0 * omega0 * omega0);\n\tconst animationNode = {\n\t\ttoValue,\n\t\tprevPosition: current,\n\t\tlastTimestamp: now,\n\t\tcurrent: zeta < 1 ? underDampedPosition : criticallyDampedPosition,\n\t\tvelocity: zeta < 1 ? underDampedVelocity : criticallyDampedVelocity\n\t};\n\tadvanceCache[cacheKey] = animationNode;\n\treturn animationNode;\n}\nconst calculationCache = {};\nfunction springCalculation({ frame, fps, config = {} }) {\n\tconst from = 0;\n\tconst to = 1;\n\tconst cacheKey = [\n\t\tframe,\n\t\tfps,\n\t\tconfig.damping,\n\t\tconfig.mass,\n\t\tconfig.overshootClamping,\n\t\tconfig.stiffness\n\t].join(\"-\");\n\tif (calculationCache[cacheKey]) return calculationCache[cacheKey];\n\tlet animation = {\n\t\tlastTimestamp: 0,\n\t\tcurrent: from,\n\t\ttoValue: to,\n\t\tvelocity: 0,\n\t\tprevPosition: 0\n\t};\n\tconst frameClamped = Math.max(0, frame);\n\tconst unevenRest = frameClamped % 1;\n\tfor (let f = 0; f <= Math.floor(frameClamped); f++) {\n\t\tif (f === Math.floor(frameClamped)) f += unevenRest;\n\t\tconst time = f / fps * 1e3;\n\t\tanimation = advance({\n\t\t\tanimation,\n\t\t\tnow: time,\n\t\t\tconfig: {\n\t\t\t\t...defaultSpringConfig,\n\t\t\t\t...config\n\t\t\t}\n\t\t});\n\t}\n\tcalculationCache[cacheKey] = animation;\n\treturn animation;\n}\nconst measureCache = /* @__PURE__ */ new Map();\nfunction measureSpring({ fps, config = {}, threshold = .005 }) {\n\tif (typeof threshold !== \"number\") throw new TypeError(`threshold must be a number, got ${threshold}`);\n\tif (threshold === 0) return Infinity;\n\tif (threshold === 1) return 0;\n\tif (Number.isNaN(threshold)) throw new TypeError(\"Threshold is NaN\");\n\tif (!Number.isFinite(threshold)) throw new TypeError(\"Threshold is not finite\");\n\tif (threshold < 0) throw new TypeError(\"Threshold is below 0\");\n\tconst cacheKey = [\n\t\tfps,\n\t\tconfig.damping,\n\t\tconfig.mass,\n\t\tconfig.overshootClamping,\n\t\tconfig.stiffness,\n\t\tthreshold\n\t].join(\"-\");\n\tif (measureCache.has(cacheKey)) return measureCache.get(cacheKey);\n\tlet frame = 0;\n\tlet finishedFrame = 0;\n\tconst calc = () => {\n\t\treturn springCalculation({\n\t\t\tfps,\n\t\t\tframe,\n\t\t\tconfig\n\t\t});\n\t};\n\tlet animation = calc();\n\tconst calcDifference = () => {\n\t\treturn Math.abs(animation.current - animation.toValue);\n\t};\n\tlet difference = calcDifference();\n\twhile (difference >= threshold) {\n\t\tframe++;\n\t\tanimation = calc();\n\t\tdifference = calcDifference();\n\t}\n\tfinishedFrame = frame;\n\tfor (let i = 0; i < 20; i++) {\n\t\tframe++;\n\t\tanimation = calc();\n\t\tdifference = calcDifference();\n\t\tif (difference >= threshold) {\n\t\t\ti = 0;\n\t\t\tfinishedFrame = frame + 1;\n\t\t}\n\t}\n\tmeasureCache.set(cacheKey, finishedFrame);\n\treturn finishedFrame;\n}\nfunction spring({ frame: passedFrame, fps, config = {}, from = 0, to = 1, durationInFrames: passedDurationInFrames, durationRestThreshold, delay = 0, reverse = false }) {\n\tconst needsToCalculateNaturalDuration = reverse || typeof passedDurationInFrames !== \"undefined\";\n\tconst naturalDuration = needsToCalculateNaturalDuration ? measureSpring({\n\t\tfps,\n\t\tconfig,\n\t\tthreshold: durationRestThreshold\n\t}) : void 0;\n\tconst naturalDurationGetter = needsToCalculateNaturalDuration ? { get: () => naturalDuration } : { get: () => {\n\t\tthrow new Error(\"did not calculate natural duration\");\n\t} };\n\tconst delayProcessed = (reverse ? (passedDurationInFrames ?? naturalDurationGetter.get()) - passedFrame : passedFrame) + (reverse ? delay : -delay);\n\tconst durationProcessed = passedDurationInFrames === void 0 ? delayProcessed : delayProcessed / (passedDurationInFrames / naturalDurationGetter.get());\n\tif (passedDurationInFrames && delayProcessed > passedDurationInFrames) return to;\n\tconst spr = springCalculation({\n\t\tfps,\n\t\tframe: durationProcessed,\n\t\tconfig\n\t});\n\tconst inner = config.overshootClamping ? to >= from ? Math.min(spr.current, to) : Math.max(spr.current, to) : spr.current;\n\treturn from === 0 && to === 1 ? inner : interpolate(inner, [0, 1], [from, to]);\n}\n\n//#endregion\n//#region src/text-measurer.ts\nconst cache = /* @__PURE__ */ new Map();\nfunction getCacheKey(text, style) {\n\treturn JSON.stringify({\n\t\ttext,\n\t\t...style\n\t});\n}\n/**\n* Shared text measurer that uses SlugGeometry.measure for all environments.\n*/\nfunction measureText(text, style) {\n\tconst safeText = text ? String(text) : \" \";\n\tconst cacheKey = getCacheKey(safeText, style);\n\tconst cached = cache.get(cacheKey);\n\tif (cached) return cached;\n\tconst fontSize = style.fontSize ?? 48;\n\tlet fontFamily = style.fontFamily ?? \"Inter\";\n\tif (SlugFontCache.isFailed(fontFamily)) fontFamily = \"Inter\";\n\tconst letterSpacing = style.letterSpacing ?? 0;\n\tconst calculatedLineHeight = style.lineHeight !== void 0 && style.lineHeight < 10 ? style.lineHeight * fontSize : style.lineHeight ?? fontSize * 1.2;\n\tconst slugFont = SlugFontCache.getFont(fontFamily, style.fontWeight, null, void 0, fontSize);\n\tconst padding = style.padding ?? 0;\n\tif (!slugFont) {\n\t\tif (!SlugFontCache.isFailed(fontFamily)) SlugFontCache.preloadSlugFont(null, fontFamily, fontUrl(fontFamily)).catch(() => {});\n\t\tconst lines = safeText.split(\"\\n\");\n\t\tlet totalWrappedLines = 0;\n\t\tconst maxW = style.width !== void 0 ? Math.max(10, style.width - padding * 2) : 0;\n\t\tfor (const line of lines) if (maxW > 0) {\n\t\t\tconst estLineWidth = line.length * fontSize * .55 + letterSpacing * line.length;\n\t\t\tconst wrapCount = Math.max(1, Math.ceil(estLineWidth / maxW));\n\t\t\ttotalWrappedLines += wrapCount;\n\t\t} else totalWrappedLines += 1;\n\t\tconst letterGaps = Math.max(0, safeText.length - 1);\n\t\tconst result$1 = {\n\t\t\twidth: style.width !== void 0 ? style.width : Math.ceil(safeText.length * fontSize * .6 + letterSpacing * letterGaps) + padding * 2,\n\t\t\theight: style.height !== void 0 ? style.height : Math.ceil(totalWrappedLines * calculatedLineHeight) + padding * 2\n\t\t};\n\t\tcache.set(cacheKey, result$1);\n\t\treturn result$1;\n\t}\n\tconst measured = SlugGeometry.measure(safeText, slugFont, fontSize, letterSpacing, calculatedLineHeight, style.width !== void 0 ? Math.max(0, style.width - padding * 2) : void 0, style.spans, style.direction);\n\tconst result = {\n\t\twidth: style.width !== void 0 && !style.keepNaturalWidth ? style.width : Math.ceil(measured.width) + padding * 2,\n\t\theight: style.height !== void 0 ? style.height : Math.ceil(measured.height) + padding * 2\n\t};\n\tcache.set(cacheKey, result);\n\treturn result;\n}\n/**\n* Async variant of measureText. Preloads the Slug font and yields to the browser.\n*/\nfunction measureTextAsync(text, style) {\n\tlet fontFamily = style.fontFamily ?? \"Inter\";\n\tif (SlugFontCache.isFailed(fontFamily)) fontFamily = \"Inter\";\n\tif (SlugFontCache.isFailed(fontFamily)) return Promise.resolve(measureText(text, style));\n\treturn SlugFontCache.preloadSlugFont(null, fontFamily, fontUrl(fontFamily)).then(() => measureText(text, style)).catch(() => measureText(text, style));\n}\n\n//#endregion\nexport { Easing, bezier, computeStrokeRect, interpolate, mapBlendModeToSkia, measureSpring, measureText, measureTextAsync, preloadCompositionFonts, preloadFont, requiresIsolation, spring, springCalculation };\n//# sourceMappingURL=index.mjs.map","import { DEFAULT_DURATION_MS, getActiveMediaMetadata, resolveMediaMimeType } from \"@framefields/core\";\nimport { resolveMediaSourceUrl } from \"@framefields/client-utils\";\nimport { interpolate, spring } from \"@framefields/renderers\";\n\n//#region src/utils/apply-operations.ts\n/**\n* Compute render parameters for the CURRENT node only — does NOT recurse into\n* children. Each node in the VirtualMedia tree is responsible for exactly its\n* own operation; `SingleClipComposition` drives traversal via React recursion.\n*\n* This is the correct function to use inside the renderer.\n*/\nfunction computeRenderParams(vv) {\n\tconst op = vv.operation;\n\tconst baseMeta = getActiveMediaMetadata(vv);\n\tconst params = {\n\t\tsourceUrl: void 0,\n\t\ttrimStartSec: 0,\n\t\ttrimEndSec: null,\n\t\tspeed: 1,\n\t\tcropRegion: null,\n\t\tflipH: false,\n\t\tflipV: false,\n\t\trotation: 0,\n\t\teffectiveDurationSec: 0,\n\t\tmimeType: resolveMediaMimeType(vv) || null\n\t};\n\tswitch (op.op) {\n\t\tcase \"text\":\n\t\t\tparams.sourceUrl = void 0;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tparams.sourceUrl = resolveMediaSourceUrl(vv);\n\t\t\tbreak;\n\t}\n\tconst sourceDurationSec = (baseMeta?.durationMs ?? 0) / 1e3;\n\tparams.effectiveDurationSec = ((params.trimEndSec ?? sourceDurationSec) - params.trimStartSec) / params.speed;\n\treturn params;\n}\n\n//#endregion\n//#region src/utils/timing.ts\nfunction framesToSeconds(frames, fps) {\n\treturn frames / fps;\n}\nfunction secondsToFrames(seconds, fps) {\n\treturn Math.round(seconds * fps);\n}\nfunction formatTimecode(seconds) {\n\tconst mins = Math.floor(seconds / 60);\n\tconst secs = Math.floor(seconds % 60);\n\tconst ms = Math.floor(seconds % 1 * 100);\n\treturn `${mins.toString().padStart(2, \"0\")}:${secs.toString().padStart(2, \"0\")}.${ms.toString().padStart(2, \"0\")}`;\n}\n\n//#endregion\n//#region src/utils/layer-logic.ts\nconst isStaticVisualMedia = (type) => type === \"Image\" || type === \"SVG\" || type === \"Text\";\nconst resolveLayerDuration = (layerDurationInMS, metaDurationMs, defaultDuration = DEFAULT_DURATION_MS, type) => {\n\tif (type === \"Caption\") return metaDurationMs && metaDurationMs > 0 ? metaDurationMs : layerDurationInMS || defaultDuration;\n\tconst isStatic = isStaticVisualMedia(type);\n\tif (layerDurationInMS && metaDurationMs && !isStatic) return Math.min(layerDurationInMS, metaDurationMs);\n\treturn layerDurationInMS || metaDurationMs || defaultDuration;\n};\nconst calculateLayerTransform = (layer, frame, fps, viewport) => {\n\tconst relativeFrame = frame - (layer.startFrame ?? 0);\n\tlet x = layer.x ?? 0;\n\tlet y = layer.y ?? 0;\n\tlet scale = layer.scale ?? 1;\n\tlet rotation = layer.rotation ?? 0;\n\tlet opacity = layer.opacity ?? 1;\n\tconst volume = layer.volume ?? 1;\n\tconst layerDurationMs = resolveLayerDuration(layer.durationInMS, layer.virtualMedia?.metadata?.durationMs ?? void 0, DEFAULT_DURATION_MS, layer.type);\n\tconst duration = Math.round(layerDurationMs / 1e3 * fps);\n\tconst animations = layer.type === \"Text\" || layer.type === \"Caption\" ? [] : layer.animations ?? [];\n\tif (animations.length === 0) return {\n\t\tx,\n\t\ty,\n\t\tscale,\n\t\trotation,\n\t\topacity,\n\t\tvolume\n\t};\n\tanimations.forEach((anim) => {\n\t\tconst durFrames = anim.value * fps;\n\t\tconst isOut = anim.type.includes(\"-out\");\n\t\tconst startAnimFrame = isOut ? duration - durFrames : 0;\n\t\tconst endAnimFrame = isOut ? duration : durFrames;\n\t\tif (relativeFrame < startAnimFrame || relativeFrame > endAnimFrame) return;\n\t\tconst progress = interpolate(relativeFrame, [startAnimFrame, endAnimFrame], [0, 1], {\n\t\t\textrapolateLeft: \"clamp\",\n\t\t\textrapolateRight: \"clamp\"\n\t\t});\n\t\tswitch (anim.type) {\n\t\t\tcase \"fade-in\":\n\t\t\t\topacity *= progress;\n\t\t\t\tbreak;\n\t\t\tcase \"fade-out\":\n\t\t\t\topacity *= 1 - progress;\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-left\":\n\t\t\t\tx += -1 * viewport.w * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-right\":\n\t\t\t\tx += 1 * viewport.w * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-top\":\n\t\t\t\ty += -1 * viewport.h * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"slide-in-bottom\":\n\t\t\t\ty += 1 * viewport.h * (1 - progress);\n\t\t\t\tbreak;\n\t\t\tcase \"zoom-in\":\n\t\t\t\tscale *= interpolate(progress, [0, 1], [0, 1]);\n\t\t\t\tbreak;\n\t\t\tcase \"zoom-out\":\n\t\t\t\tscale *= interpolate(progress, [0, 1], [1, 0]);\n\t\t\t\tbreak;\n\t\t\tcase \"rotate-cw\":\n\t\t\t\trotation += 360 * progress;\n\t\t\t\tbreak;\n\t\t\tcase \"rotate-ccw\":\n\t\t\t\trotation += -360 * progress;\n\t\t\t\tbreak;\n\t\t\tcase \"bounce\": {\n\t\t\t\tconst bounceVal = spring({\n\t\t\t\t\tframe: relativeFrame - startAnimFrame,\n\t\t\t\t\tfps,\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tdamping: 10,\n\t\t\t\t\t\tmass: .5,\n\t\t\t\t\t\tstiffness: 100\n\t\t\t\t\t},\n\t\t\t\t\tdurationInFrames: durFrames\n\t\t\t\t});\n\t\t\t\tscale *= bounceVal;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"shake\":\n\t\t\t\tx += 20 * Math.sin(relativeFrame * 10 * 2 * Math.PI / durFrames) * (1 - progress);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\treturn {\n\t\tx,\n\t\ty,\n\t\tscale,\n\t\trotation,\n\t\topacity,\n\t\tvolume\n\t};\n};\n\n//#endregion\nexport { framesToSeconds as a, formatTimecode as i, isStaticVisualMedia as n, secondsToFrames as o, resolveLayerDuration as r, computeRenderParams as s, calculateLayerTransform as t };\n//# sourceMappingURL=layer-logic-C4ls-aB4.mjs.map","import { a as framesToSeconds, i as formatTimecode, n as isStaticVisualMedia, o as secondsToFrames, r as resolveLayerDuration, s as computeRenderParams, t as calculateLayerTransform } from \"./layer-logic-C4ls-aB4.mjs\";\nimport { getActiveMediaMetadata, getMediaType, isSignal, mediaSourceIsHold, mediaSourceRange, mediaSourceTime, updateClockSignals } from \"@framefields/core\";\nimport { audioRegistry, webgpuRegistry } from \"@framefields/node-sdk\";\nimport { drawCaptionNode, drawGifNode, drawImageNode, drawLottieNode, drawParagraphNode, drawSignalNode, drawSvgNode, drawVideoNode, inputStore, shaderStore, signalRegistry } from \"@framefields/webgpu-renderers\";\nimport { AudioSampleSink } from \"mediabunny\";\n\n//#region src/compositions/canvas-composition.ts\nconst segmentRangeCache = /* @__PURE__ */ new WeakMap();\nfunction getCachedSegmentRanges(segments, fps) {\n\tconst cached = segmentRangeCache.get(segments);\n\tif (cached && cached.fps === fps) return cached.ranges;\n\tlet currentStart = 0;\n\tconst ranges = segments.map((seg) => {\n\t\tconst durSec = (seg.endSec ?? 0) - seg.startSec;\n\t\tconst durFrames = Math.max(1, Math.round(durSec * fps));\n\t\tconst start = currentStart;\n\t\tcurrentStart += durFrames;\n\t\treturn {\n\t\t\tseg,\n\t\t\tstart,\n\t\t\tduration: durFrames\n\t\t};\n\t});\n\tsegmentRangeCache.set(segments, {\n\t\tfps,\n\t\tranges\n\t});\n\treturn ranges;\n}\nconst frameCtxPool = [];\nfunction acquireFrameContext() {\n\treturn frameCtxPool.pop() ?? {};\n}\n/**\n* Effect operations carry every config field as a signal. Hand node renderers\n* the plain value for this frame (nested objects/arrays included), keeping only\n* GPU-bound signals intact since those are consumed as textures.\n*/\nfunction resolveSignalOperation(virtualMedia, frameCtx) {\n\tconst op = virtualMedia.operation;\n\tconst resolved = { ...op };\n\tfor (const [key, sig] of Object.entries(op.signals)) if (isSignal(sig) && !sig.gpuBinding) resolved[key] = sig.get(frameCtx);\n\treturn {\n\t\t...virtualMedia,\n\t\toperation: resolved\n\t};\n}\n/** The paragraph props a text operation maps to, shared by both text paths. */\nfunction paragraphPropsFromTextOp(opText, props, timing) {\n\treturn {\n\t\ttext: opText.text || \"\",\n\t\tdstRect: {\n\t\t\tx: Number(opText.x ?? 0),\n\t\t\ty: Number(opText.y ?? 0),\n\t\t\twidth: Number(opText.width ?? timing.containerWidth),\n\t\t\theight: Number(opText.height ?? timing.containerHeight)\n\t\t},\n\t\tfontFamily: opText.fontFamily,\n\t\tfontSize: Number(opText.fontSize ?? 48),\n\t\tcolor: opText.fill ?? opText.color ?? \"white\",\n\t\twidth: opText.width ? Number(opText.width) : void 0,\n\t\theight: opText.height ? Number(opText.height) : void 0,\n\t\tlineHeight: Number(opText.lineHeight ?? 1.2),\n\t\talign: opText.align,\n\t\tdirection: opText.direction,\n\t\tverticalAlign: opText.verticalAlign,\n\t\tfontWeight: opText.fontWeight,\n\t\tfontStyle: opText.fontStyle,\n\t\tletterSpacing: opText.letterSpacing,\n\t\tshadows: opText.shadows,\n\t\ttextBackgroundColor: opText.textBackgroundColor,\n\t\tpadding: opText.padding != null ? Number(opText.padding) : void 0,\n\t\tstroke: opText.stroke,\n\t\tstrokeWidth: opText.strokeWidth ?? opText.strokeThickness ? Number(opText.strokeWidth ?? opText.strokeThickness) : void 0,\n\t\tstrokeAlign: opText.strokeAlign,\n\t\topacity: Number(opText.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\tisHeadless: props.isHeadless,\n\t\tanimation: opText.animation ?? opText.textAnimation,\n\t\tanimators: opText.animators,\n\t\tpathOptions: opText.pathOptions,\n\t\ttypewriter: opText.typewriter,\n\t\tmarquee: opText.marquee,\n\t\tsignals: props.signals ?? opText.signals,\n\t\tfirstMargin: opText.firstMargin != null ? Number(opText.firstMargin) : void 0,\n\t\tlastMargin: opText.lastMargin != null ? Number(opText.lastMargin) : void 0,\n\t\tbaselineShift: opText.baselineShift != null ? Number(opText.baselineShift) : void 0,\n\t\tframe: timing.frame,\n\t\tfps: timing.fps,\n\t\tdurationMs: timing.durationMs,\n\t\telapsedMs: timing.elapsedMs,\n\t\tisVideoMode: props.isVideoMode\n\t};\n}\nasync function drawCompositionTree(ctx, encoder, targetView, targetTexture, targetWidth, targetHeight, virtualMedia, props, inheritedSeekOffset = 0, inheritedClockOffset = 0) {\n\tconst fps = props.fps ?? 24;\n\tconst op = virtualMedia.operation;\n\tif (!op) return;\n\tconst isCompositor = op.op === \"Compositor\";\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst segments = op.timeline?.segments || [];\n\tconst localFrame = frame - (op.startFrame ?? op.timeline?.startFrame ?? 0);\n\tconst isTimelineProvider = op.timeline !== void 0 || op.startFrame !== void 0 || op.op === \"compose\";\n\tconst resolvedDurationMs = isTimelineProvider ? getActiveMediaMetadata(virtualMedia)?.durationMs ?? props.durationMs ?? void 0 : props.durationMs ?? getActiveMediaMetadata(virtualMedia)?.durationMs ?? void 0;\n\tif (!(op.op === \"source\" || op.op === \"text\" || op.op === \"caption\")) updateClockSignals(compositionFrame, fps, resolvedDurationMs);\n\tconst frameCtx = acquireFrameContext();\n\tframeCtx.frame = compositionFrame;\n\tframeCtx.fps = fps;\n\tframeCtx.time = fps > 0 ? compositionFrame / fps : 0;\n\tframeCtx.duration = (resolvedDurationMs ?? 0) / 1e3;\n\tframeCtx.durationMs = resolvedDurationMs ?? 0;\n\tframeCtx.progress = resolvedDurationMs && resolvedDurationMs > 0 ? Math.max(0, Math.min(1, compositionFrame / fps * 1e3 / resolvedDurationMs)) : 0;\n\tframeCtx.deltaTime = fps > 0 ? 1 / fps : 0;\n\tconst resolvedElapsedMs = isTimelineProvider ? (localFrame !== void 0 && fps !== void 0 ? localFrame / fps * 1e3 : void 0) ?? props.elapsedMs : props.elapsedMs ?? (localFrame !== void 0 && fps !== void 0 ? localFrame / fps * 1e3 : void 0);\n\tconst effectiveLocalFrame = localFrame + Math.round(inheritedSeekOffset * fps);\n\tlet activeSeg = null;\n\tlet windowStartFrame = 0;\n\tif (segments.length > 0) {\n\t\tconst active = getCachedSegmentRanges(segments, fps).find(({ start, duration }) => effectiveLocalFrame >= start && effectiveLocalFrame < start + duration);\n\t\tif (active) {\n\t\t\tactiveSeg = active.seg;\n\t\t\twindowStartFrame = active.start;\n\t\t} else return;\n\t}\n\tconst segmentLocalFrame = localFrame - windowStartFrame;\n\tconst accumulatedSeekOffsetSec = inheritedSeekOffset + (activeSeg ? activeSeg.startSec - windowStartFrame / fps : 0);\n\tconst accumulatedClockOffsetSec = inheritedClockOffset + windowStartFrame / fps;\n\tif (typeof op.onRequestFrame === \"function\") {\n\t\tconst pending = op.onRequestFrame(frameCtx);\n\t\tif (pending && typeof pending.then === \"function\") await pending;\n\t} else if (op.effect && typeof op.effect.notifyFrame === \"function\") op.effect.notifyFrame(frameCtx);\n\tif (op.op === \"TextureSource\") {\n\t\tconst sourceTexture = op.sourceTexture;\n\t\tif (sourceTexture) {\n\t\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}, targetWidth, targetHeight, \"load\");\n\t\t\tctx.renderer.drawTexture(pass, sourceTexture, {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: targetWidth,\n\t\t\t\theight: targetHeight\n\t\t\t}, { opacity: Number(op.opacity ?? 1) });\n\t\t\tpass.end();\n\t\t}\n\t\treturn;\n\t}\n\tconst CustomRenderer = webgpuRegistry.get(op.op);\n\tif (CustomRenderer) {\n\t\tif (op.signals) virtualMedia = resolveSignalOperation(virtualMedia, frameCtx);\n\t\tconst inputs = op?.inputs;\n\t\tif (inputs) {\n\t\t\tfor (const entry of Object.values(inputs)) if (entry?.connectionValid && entry?.outputItem?.type === \"LUT\") {\n\t\t\t\tconst lutVirtualMedia = entry.outputItem.data;\n\t\t\t\tif (lutVirtualMedia && typeof lutVirtualMedia === \"object\" && lutVirtualMedia.operation) {\n\t\t\t\t\tconst lutW = lutVirtualMedia.metadata?.width ?? targetWidth;\n\t\t\t\t\tconst lutH = lutVirtualMedia.metadata?.height ?? targetHeight;\n\t\t\t\t\tconst dummyTex = ctx.renderer.getTemporaryTexture(lutW, lutH);\n\t\t\t\t\tawait drawCompositionTree(ctx, encoder, dummyTex.createView(), dummyTex, lutW, lutH, lutVirtualMedia, {\n\t\t\t\t\t\t...props,\n\t\t\t\t\t\tcompositionFrame,\n\t\t\t\t\t\tvirtualMedia: lutVirtualMedia\n\t\t\t\t\t}, accumulatedSeekOffsetSec, accumulatedClockOffsetSec);\n\t\t\t\t}\n\t\t\t} else if (entry?.connectionValid && entry?.outputItem?.type === \"Signal\") {\n\t\t\t\tconst sigData = entry.outputItem.data;\n\t\t\t\tif (sigData && typeof sigData === \"object\") await signalRegistry.ensureAudioSourcesExtracted(ctx.device, sigData.signalConfig ?? sigData, fps, props.renderId);\n\t\t\t}\n\t\t}\n\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tlet passEnded = false;\n\t\tconst originalEnd = pass.end.bind(pass);\n\t\tpass.end = () => {\n\t\t\tif (!passEnded) {\n\t\t\t\toriginalEnd();\n\t\t\t\tpassEnded = true;\n\t\t\t}\n\t\t};\n\t\tconst renderArgs = {\n\t\t\tctx,\n\t\t\tencoder,\n\t\t\tpass,\n\t\t\ttargetView,\n\t\t\ttargetTexture,\n\t\t\ttargetWidth,\n\t\t\ttargetHeight,\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\tcompositionFrame,\n\t\t\t\tvirtualMedia,\n\t\t\t\tinheritedSeekOffset: accumulatedSeekOffsetSec,\n\t\t\t\tinheritedClockOffset: accumulatedClockOffsetSec,\n\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\telapsedMs: resolvedElapsedMs\n\t\t\t},\n\t\t\tdrawChild: async (child, overrides, targetViewOverride, targetTextureOverride, targetWidthOverride, targetHeightOverride) => {\n\t\t\t\tawait drawCompositionTree(ctx, encoder, targetViewOverride ?? targetView, targetTextureOverride ?? targetTexture, targetWidthOverride ?? targetWidth, targetHeightOverride ?? targetHeight, child, {\n\t\t\t\t\t...props,\n\t\t\t\t\tcompositionFrame,\n\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\t\t\tvirtualMedia: child,\n\t\t\t\t\t...overrides,\n\t\t\t\t\texcludeTextures: [\n\t\t\t\t\t\t...props.excludeTextures || [],\n\t\t\t\t\t\t...overrides?.excludeTextures || [],\n\t\t\t\t\t\ttargetTextureOverride ?? targetTexture\n\t\t\t\t\t]\n\t\t\t\t}, isCompositor ? 0 : accumulatedSeekOffsetSec, accumulatedClockOffsetSec);\n\t\t\t}\n\t\t};\n\t\tawait CustomRenderer(renderArgs);\n\t\trenderArgs.pass.end();\n\t\treturn;\n\t}\n\tif (op.op === \"LUT\") return;\n\tif (op.op === \"Signal\" || op.op === \"SignalMath\" || op.dataType === \"Signal\") {\n\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tawait drawSignalNode(ctx, encoder, pass, {\n\t\t\tnodeId: op.nodeId || op.signalConfig?.nodeId || props.renderId,\n\t\t\tfunc: op.func,\n\t\t\tamplitude: Number(op.amplitude ?? 1),\n\t\t\tfrequency: Number(op.frequency ?? 1),\n\t\t\tphase: Number(op.phase ?? 0),\n\t\t\toffset: Number(op.offset ?? 0),\n\t\t\tsignalConfig: {\n\t\t\t\t...op.signalConfig,\n\t\t\t\t...op\n\t\t\t},\n\t\t\tframe,\n\t\t\tfps,\n\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\tdurationMs: resolvedDurationMs ?? 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight,\n\t\t\tdrawChild: async (child, childProps, childView, childTex, childW, childH) => {\n\t\t\t\tawait drawCompositionTree(ctx, encoder, childView, childTex, childW, childH, child, {\n\t\t\t\t\t...props,\n\t\t\t\t\tcompositionFrame,\n\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\t\t\t...childProps,\n\t\t\t\t\texcludeTextures: [\n\t\t\t\t\t\t...props.excludeTextures || [],\n\t\t\t\t\t\t...childProps?.excludeTextures || [],\n\t\t\t\t\t\tchildTex\n\t\t\t\t\t]\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tpass.end();\n\t\treturn;\n\t}\n\tif (op.op === \"source\" || op.op === \"text\" || op.op === \"caption\") {\n\t\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tif (op.op === \"source\") {\n\t\t\tconst mediaType = getMediaType(virtualMedia);\n\t\t\tconst params = computeRenderParams(virtualMedia);\n\t\t\tif (params.sourceUrl) {\n\t\t\t\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\t\t\t\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\t\t\t\tif (mediaType === \"Image\") await drawImageNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"SVG\") await drawSvgNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\topacity: Number(op.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"Lottie\") await drawLottieNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\tframe: segmentLocalFrame + Math.round(accumulatedSeekOffsetSec * fps),\n\t\t\t\t\tfps,\n\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\t\tdpr: typeof props.dpr === \"number\" ? props.dpr : typeof op.dpr === \"number\" ? op.dpr : void 0\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"GIF\") await drawGifNode(ctx, pass, {\n\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\tdstRect: {\n\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t},\n\t\t\t\t\tframe: segmentLocalFrame + Math.round(accumulatedSeekOffsetSec * fps),\n\t\t\t\t\tfps,\n\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\tisHeadless: props.isHeadless\n\t\t\t\t});\n\t\t\t\telse if (mediaType === \"Text\") {\n\t\t\t\t\tconst opText = { ...op };\n\t\t\t\t\tdrawParagraphNode(ctx, pass, {\n\t\t\t\t\t\t...paragraphPropsFromTextOp(opText, props, {\n\t\t\t\t\t\t\tcontainerWidth,\n\t\t\t\t\t\t\tcontainerHeight,\n\t\t\t\t\t\t\tframe: localFrame,\n\t\t\t\t\t\t\tfps,\n\t\t\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\t\t\telapsedMs: resolvedElapsedMs\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tborderRadius: opText.borderRadius != null ? Number(opText.borderRadius) : void 0,\n\t\t\t\t\t\ttextProgress: opText.textProgress != null ? Number(opText.textProgress) : void 0\n\t\t\t\t\t});\n\t\t\t\t} else if (mediaType === \"Video\") {\n\t\t\t\t\tconst finalPlaybackRate = Math.max(.01, (Number(props.playbackRateOverride) || 1) * (Number(params.speed) || 1));\n\t\t\t\t\tconst effectiveTrimSec = Math.max(0, (Number(props.trimStartOverride) || 0) + (Number(params.trimStartSec) || 0) + accumulatedSeekOffsetSec);\n\t\t\t\t\tconst rawTimestampSec = props.sourceTimeSec ?? segmentLocalFrame / fps * finalPlaybackRate + effectiveTrimSec;\n\t\t\t\t\tconst timestampSec = Math.max(0, Number.isFinite(rawTimestampSec) ? rawTimestampSec : 0);\n\t\t\t\t\tawait drawVideoNode(ctx, pass, {\n\t\t\t\t\t\tnodeId: props.renderId,\n\t\t\t\t\t\tframeKey: `${props.renderId ?? \"video\"}-${params.sourceUrl}-${timestampSec}`,\n\t\t\t\t\t\tsourceUrl: params.sourceUrl,\n\t\t\t\t\t\ttimestampSec,\n\t\t\t\t\t\tdstRect: {\n\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\topacity: Number(op.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\t\t\tisPlaying: props.isPlaying,\n\t\t\t\t\t\tforceWait: props.forceWait\n\t\t\t\t\t});\n\t\t\t\t} else if (mediaType === \"Caption\") {\n\t\t\t\t\tconst opCap = {\n\t\t\t\t\t\t...op,\n\t\t\t\t\t\t...props\n\t\t\t\t\t};\n\t\t\t\t\tawait drawCaptionNode(ctx, pass, {\n\t\t\t\t\t\trenderId: props.renderId,\n\t\t\t\t\t\tsrc: params.sourceUrl,\n\t\t\t\t\t\tdstRect: {\n\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t\ty: 0,\n\t\t\t\t\t\t\twidth: containerWidth,\n\t\t\t\t\t\t\theight: containerHeight\n\t\t\t\t\t\t},\n\t\t\t\t\t\tframe: localFrame,\n\t\t\t\t\t\tfps,\n\t\t\t\t\t\tfontFamily: opCap.fontFamily,\n\t\t\t\t\t\tfontSize: Number(opCap.fontSize ?? 48),\n\t\t\t\t\t\tcolor: opCap.fill ?? opCap.color ?? \"white\",\n\t\t\t\t\t\tlineHeight: Number(opCap.lineHeight ?? 1.2),\n\t\t\t\t\t\talign: opCap.align ?? \"center\",\n\t\t\t\t\t\tdirection: opCap.direction,\n\t\t\t\t\t\ttextAlignVertical: opCap.verticalAlign ?? opCap.textAlignVertical,\n\t\t\t\t\t\tfontWeight: opCap.fontWeight,\n\t\t\t\t\t\tfontStyle: opCap.fontStyle,\n\t\t\t\t\t\tletterSpacing: opCap.letterSpacing,\n\t\t\t\t\t\tshadows: opCap.shadows,\n\t\t\t\t\t\ttextBackgroundColor: opCap.background ?? opCap.textBackgroundColor,\n\t\t\t\t\t\tborderRadius: (opCap.borderRadius ?? opCap.strokeRadius) != null ? Number(opCap.borderRadius ?? opCap.strokeRadius) : void 0,\n\t\t\t\t\t\tstrokeRadius: (opCap.strokeRadius ?? opCap.borderRadius) != null ? Number(opCap.strokeRadius ?? opCap.borderRadius) : void 0,\n\t\t\t\t\t\tstroke: opCap.stroke,\n\t\t\t\t\t\tstrokeWidth: (opCap.strokeWidth ?? opCap.strokeThickness) != null ? Number(opCap.strokeWidth ?? opCap.strokeThickness) : void 0,\n\t\t\t\t\t\tmaxWidth: opCap.maxWidth,\n\t\t\t\t\t\tpadding: opCap.padding != null ? Number(opCap.padding) : void 0,\n\t\t\t\t\t\topacity: Number(opCap.opacity ?? 1) * Number(props.opacity ?? 1),\n\t\t\t\t\t\tisHeadless: props.isHeadless,\n\t\t\t\t\t\tisVideoMode: props.isVideoMode\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (op.op === \"text\") {\n\t\t\tconst opText = { ...op };\n\t\t\tdrawParagraphNode(ctx, pass, {\n\t\t\t\t...paragraphPropsFromTextOp(opText, props, {\n\t\t\t\t\tcontainerWidth: props.containerWidth ?? ctx.surface.width,\n\t\t\t\t\tcontainerHeight: props.containerHeight ?? ctx.surface.height,\n\t\t\t\t\tframe: localFrame,\n\t\t\t\t\tfps,\n\t\t\t\t\tdurationMs: resolvedDurationMs,\n\t\t\t\t\telapsedMs: resolvedElapsedMs\n\t\t\t\t}),\n\t\t\t\trenderId: props.renderId,\n\t\t\t\tspans: opText.spans,\n\t\t\t\tborderRadius: (opText.borderRadius ?? opText.strokeRadius) != null ? Number(opText.borderRadius ?? opText.strokeRadius) : void 0,\n\t\t\t\tstrokeRadius: (opText.strokeRadius ?? opText.borderRadius) != null ? Number(opText.strokeRadius ?? opText.borderRadius) : void 0\n\t\t\t});\n\t\t}\n\t\tpass.end();\n\t}\n\tif (virtualMedia.children && virtualMedia.children.length > 0) for (let i = 0; i < virtualMedia.children.length; i++) {\n\t\tconst child = virtualMedia.children[i];\n\t\tif (child) await drawCompositionTree(ctx, encoder, targetView, targetTexture, targetWidth, targetHeight, child, {\n\t\t\t...props,\n\t\t\tcompositionFrame,\n\t\t\tdurationMs: resolvedDurationMs,\n\t\t\telapsedMs: resolvedElapsedMs,\n\t\t\tvirtualMedia: child,\n\t\t\trenderId: `${props.renderId}-c${i}`\n\t\t}, isCompositor ? 0 : accumulatedSeekOffsetSec, accumulatedClockOffsetSec);\n\t}\n}\n\n//#endregion\n//#region src/compositions/composition-state.ts\nconst DEFAULT_STATE = {\n\tframe: 0,\n\tfps: 30,\n\tisPlaying: false\n};\nvar CompositionStateStore = class {\n\tstates = /* @__PURE__ */ new Map();\n\tlisteners = /* @__PURE__ */ new Map();\n\tsetState(key, frame, fps, isPlaying) {\n\t\tconst current = this.states.get(key);\n\t\tconst resolvedPlaying = isPlaying !== void 0 ? isPlaying : current?.isPlaying ?? false;\n\t\tif (current?.frame === frame && current?.fps === fps && current?.isPlaying === resolvedPlaying) return;\n\t\tthis.states.set(key, {\n\t\t\tframe,\n\t\t\tfps,\n\t\t\tisPlaying: resolvedPlaying\n\t\t});\n\t\tthis.notify(key);\n\t}\n\tgetState(key) {\n\t\tif (this.states.has(key)) return this.states.get(key);\n\t\tfor (const [storeKey, value] of this.states.entries()) if (key.startsWith(storeKey)) return value;\n\t\treturn DEFAULT_STATE;\n\t}\n\tsubscribe(key, listener) {\n\t\tif (!this.listeners.has(key)) this.listeners.set(key, /* @__PURE__ */ new Set());\n\t\tthis.listeners.get(key).add(listener);\n\t\treturn () => {\n\t\t\tconst set = this.listeners.get(key);\n\t\t\tset?.delete(listener);\n\t\t\tif (set?.size === 0) {\n\t\t\t\tthis.listeners.delete(key);\n\t\t\t\tthis.states.delete(key);\n\t\t\t}\n\t\t};\n\t}\n\tclearKey(key) {\n\t\tthis.states.delete(key);\n\t}\n\tnotify(key) {\n\t\tfor (const [listenerKey, set] of this.listeners.entries()) if (listenerKey === key || listenerKey.startsWith(key)) set.forEach((l) => l());\n\t}\n};\nconst compositionStateStore = new CompositionStateStore();\n\n//#endregion\n//#region src/utils/normalization.ts\n/**\n* normalizeTimeline recurses through the virtual media tree and \"absorbs\"\n* generic timeline-shifting operations into standard properties\n* of their children.\n*/\nfunction normalizeTimeline(vv, fps, context = { timeOffsetSec: 0 }) {\n\tif (!vv) return vv;\n\tconst { operation, metadata = {}, children = [] } = vv;\n\tconst { timeOffsetSec, durationLimitMs } = context;\n\tif (!operation) return {\n\t\t...vv,\n\t\tchildren: (children || []).map((child) => normalizeTimeline(child, fps, context))\n\t};\n\tconst timeline = operation.timeline;\n\tconst segments = timeline?.segments || [];\n\tlet totalDurationMs = getActiveMediaMetadata(vv)?.durationMs ?? 0;\n\tif (segments.length > 0) {\n\t\tconst totalSegmentsFrames = segments.reduce((acc, seg) => {\n\t\t\tconst durSec = seg.endSec != null ? seg.endSec - seg.startSec : 0;\n\t\t\treturn acc + Math.max(1, Math.round(durSec * fps));\n\t\t}, 0);\n\t\tif (totalSegmentsFrames > 0) totalDurationMs = totalSegmentsFrames / fps * 1e3;\n\t}\n\tconst newOperation = { ...operation };\n\tconst rawStartFrame = timeline?.startFrame ?? newOperation.startFrame;\n\tif (typeof rawStartFrame === \"number\") newOperation.startFrame = rawStartFrame - secondsToFrames(timeOffsetSec, fps);\n\tconst newMetadata = {\n\t\t...metadata,\n\t\tdurationMs: totalDurationMs\n\t};\n\tconst childContext = typeof rawStartFrame === \"number\" || newOperation.op === \"compose\" ? {\n\t\ttimeOffsetSec: 0,\n\t\tdurationLimitMs: void 0\n\t} : {\n\t\ttimeOffsetSec,\n\t\tdurationLimitMs\n\t};\n\treturn {\n\t\tmetadata: newMetadata,\n\t\toperation: newOperation,\n\t\tchildren: (children || []).map((child) => normalizeTimeline(child, fps, childContext))\n\t};\n}\n\n//#endregion\n//#region src/utils/audio-extractor.ts\nconst verbose = typeof process !== \"undefined\" && /^(debug|trace)$/i.test(process.env?.LOG_LEVEL ?? \"\");\nconst mediaLogger = {\n\tdebug: (msg, ...args) => {\n\t\tif (!verbose) return;\n\t\tif (typeof msg === \"object\" && msg !== null) console.info(\"[AudioExtractor]\", msg, ...args);\n\t\telse console.info(`[AudioExtractor] ${msg}`, ...args);\n\t},\n\twarn: (msg, ...args) => {\n\t\tif (typeof msg === \"object\" && msg !== null) console.warn(\"[AudioExtractor]\", msg, ...args);\n\t\telse console.warn(`[AudioExtractor] ${msg}`, ...args);\n\t},\n\terror: (msg, ...args) => {\n\t\tif (typeof msg === \"object\" && msg !== null) console.error(\"[AudioExtractor]\", msg, ...args);\n\t\telse console.error(`[AudioExtractor] ${msg}`, ...args);\n\t}\n};\nconst yieldToMain = () => {\n\tif (typeof window === \"undefined\") return Promise.resolve();\n\tconst sched = globalThis.scheduler;\n\treturn typeof sched?.yield === \"function\" ? sched.yield() : new Promise((resolve) => setTimeout(resolve, 0));\n};\nconst waitForDelayRender = async (timeoutMs = 3e4) => {\n\tawait new Promise((resolve) => setTimeout(resolve, 100));\n\tconst start = Date.now();\n\treturn new Promise((resolve) => {\n\t\tconst check = () => {\n\t\t\tconst browserHandles = typeof window !== \"undefined\" && window.renderer_delayRenderHandles ? window.renderer_delayRenderHandles : [];\n\t\t\tconst globalDelays = typeof globalThis !== \"undefined\" ? globalThis.__GATEWAI_DELAYS__ : null;\n\t\t\tconst hasBrowserDelays = browserHandles.length > 0;\n\t\t\tconst hasGlobalDelays = globalDelays instanceof Set && globalDelays.size > 0;\n\t\t\tif (!hasBrowserDelays && !hasGlobalDelays) {\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() - start > timeoutMs) {\n\t\t\t\tmediaLogger.warn(`[AudioExtractor] waitForDelayRender timed out waiting for handles: ${JSON.stringify({\n\t\t\t\t\tbrowserHandles,\n\t\t\t\t\tglobalDelays: globalDelays ? Array.from(globalDelays) : []\n\t\t\t\t})}`);\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetTimeout(check, 50);\n\t\t};\n\t\tcheck();\n\t});\n};\n/**\n* Decodes all audio samples from a given source URL into raw Float32 mono/stereo channel buffers.\n*/\nasync function decodeAudioSource(url) {\n\tconst decoded = await decodeAudioRange(url);\n\treturn decoded ? {\n\t\tchannels: decoded.channels,\n\t\tsampleRate: decoded.sampleRate\n\t} : null;\n}\n/**\n* Seconds decoded ahead of a requested range: a compressed stream (MP3, AAC)\n* decoded from mid-file only matches a whole-file decode once the decoder has\n* warmed up on the packets before it.\n*/\nconst DECODE_PREROLL_SEC = .5;\n/**\n* Decodes [range.startSec, range.endSec) of a source (the whole file without\n* a range), so a short clip from a long file decodes only what it plays.\n*/\nasync function decodeAudioRange(url, range) {\n\tmediaLogger.debug(`[AudioExtractor] decodeAudioSource started for url: ${url}`);\n\ttry {\n\t\tif (typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && !(typeof process !== \"undefined\" && process.versions && process.versions.node)) {\n\t\t\tmediaLogger.debug(`[AudioExtractor] Browser detected. Fetching arrayBuffer for ${url}...`);\n\t\t\tconst AudioContextClass = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (!AudioContextClass) throw new Error(\"AudioContext is not supported in this browser\");\n\t\t\tconst audioCtx = new AudioContextClass();\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(url);\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] Fetch response status for ${url}: ${response.status} (${response.statusText})`);\n\t\t\t\tif (!response.ok) throw new Error(`Failed to fetch audio source: ${response.statusText}`);\n\t\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] Fetched ${arrayBuffer.byteLength} bytes. Decoding audio data...`);\n\t\t\t\tconst audioBuffer = await audioCtx.decodeAudioData(arrayBuffer);\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] Decoded successfully: ${audioBuffer.numberOfChannels} channels, sampleRate: ${audioBuffer.sampleRate}, duration: ${audioBuffer.duration}s`);\n\t\t\t\tconst channels = [];\n\t\t\t\tfor (let c = 0; c < audioBuffer.numberOfChannels; c++) channels.push(new Float32Array(audioBuffer.getChannelData(c)));\n\t\t\t\treturn {\n\t\t\t\t\tchannels,\n\t\t\t\t\tsampleRate: audioBuffer.sampleRate,\n\t\t\t\t\tstartIndex: 0,\n\t\t\t\t\tvalidFromSec: 0,\n\t\t\t\t\tvalidToSec: Number.POSITIVE_INFINITY\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\taudioCtx.close();\n\t\t\t\tmediaLogger.debug(`[AudioExtractor] AudioContext closed for ${url}`);\n\t\t\t}\n\t\t}\n\t\tlet inputAcquired = false;\n\t\ttry {\n\t\t\tmediaLogger.debug(`[AudioExtractor] Server / Node.js detected. Acquiring from inputStore for ${url}...`);\n\t\t\tconst input = await inputStore.acquire(url);\n\t\t\tinputAcquired = true;\n\t\t\tmediaLogger.debug(`[AudioExtractor] inputStore acquired. Retrieving primary audio track...`);\n\t\t\tconst track = await input.getPrimaryAudioTrack();\n\t\t\tif (!track) {\n\t\t\t\tmediaLogger.warn(`[AudioExtractor] No primary audio track found in input for ${url}`);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst sink = new AudioSampleSink(track);\n\t\t\tconst decodeFromSec = range ? Math.max(0, range.startSec - DECODE_PREROLL_SEC) : 0;\n\t\t\tconst generator = sink.samples(decodeFromSec, range?.endSec);\n\t\t\tconst decodedPlanes = [];\n\t\t\tlet totalFrames = 0;\n\t\t\tlet sampleRate = 48e3;\n\t\t\tlet numChannels = 1;\n\t\t\tlet firstTimestamp = null;\n\t\t\tmediaLogger.debug(`[AudioExtractor] Starting mediabunny generator loop for ${url}...`);\n\t\t\tfor await (const sample of generator) {\n\t\t\t\tif (firstTimestamp === null) firstTimestamp = sample.timestamp;\n\t\t\t\tsampleRate = sample.sampleRate;\n\t\t\t\tnumChannels = sample.numberOfChannels;\n\t\t\t\tconst sampleFrames = sample.numberOfFrames;\n\t\t\t\tif (decodedPlanes.length === 0) for (let c = 0; c < numChannels; c++) decodedPlanes.push([]);\n\t\t\t\tfor (let c = 0; c < numChannels; c++) {\n\t\t\t\t\tlet planeBuffer;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst allocSize = sample.allocationSize({\n\t\t\t\t\t\t\tplaneIndex: c,\n\t\t\t\t\t\t\tformat: \"f32-planar\"\n\t\t\t\t\t\t});\n\t\t\t\t\t\tplaneBuffer = new Float32Array(allocSize / 4);\n\t\t\t\t\t\tsample.copyTo(planeBuffer, {\n\t\t\t\t\t\t\tplaneIndex: c,\n\t\t\t\t\t\t\tformat: \"f32-planar\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tconst allocSize = sample.allocationSize({ planeIndex: c });\n\t\t\t\t\t\tif (sample.format === \"s16\" || sample.format === \"s16-planar\") {\n\t\t\t\t\t\t\tconst int16Buffer = new Int16Array(allocSize / 2);\n\t\t\t\t\t\t\tsample.copyTo(int16Buffer, { planeIndex: c });\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(int16Buffer.length);\n\t\t\t\t\t\t\tfor (let i = 0; i < int16Buffer.length; i++) planeBuffer[i] = (int16Buffer[i] ?? 0) / 32768;\n\t\t\t\t\t\t} else if (sample.format === \"s32\" || sample.format === \"s32-planar\") {\n\t\t\t\t\t\t\tconst int32Buffer = new Int32Array(allocSize / 4);\n\t\t\t\t\t\t\tsample.copyTo(int32Buffer, { planeIndex: c });\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(int32Buffer.length);\n\t\t\t\t\t\t\tfor (let i = 0; i < int32Buffer.length; i++) planeBuffer[i] = (int32Buffer[i] ?? 0) / 2147483648;\n\t\t\t\t\t\t} else if (sample.format === \"u8\" || sample.format === \"u8-planar\") {\n\t\t\t\t\t\t\tconst u8Buffer = new Uint8Array(allocSize);\n\t\t\t\t\t\t\tsample.copyTo(u8Buffer, { planeIndex: c });\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(u8Buffer.length);\n\t\t\t\t\t\t\tfor (let i = 0; i < u8Buffer.length; i++) planeBuffer[i] = ((u8Buffer[i] ?? 128) - 128) / 128;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tplaneBuffer = new Float32Array(allocSize / 4);\n\t\t\t\t\t\t\tsample.copyTo(planeBuffer, { planeIndex: c });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdecodedPlanes[c].push(planeBuffer);\n\t\t\t\t}\n\t\t\t\ttotalFrames += sampleFrames;\n\t\t\t\tsample.close();\n\t\t\t}\n\t\t\tmediaLogger.debug(`[AudioExtractor] Generator loop finished. Decoded total frames: ${totalFrames}`);\n\t\t\tif (totalFrames === 0 || decodedPlanes.length === 0) return null;\n\t\t\tconst channels = decodedPlanes.map((planes) => {\n\t\t\t\tconst merged = new Float32Array(totalFrames);\n\t\t\t\tlet offset = 0;\n\t\t\t\tfor (const plane of planes) {\n\t\t\t\t\tmerged.set(plane, offset);\n\t\t\t\t\toffset += plane.length;\n\t\t\t\t}\n\t\t\t\treturn merged;\n\t\t\t});\n\t\t\tlet startIndex = 0;\n\t\t\tif (decodeFromSec > 0 && firstTimestamp !== null) {\n\t\t\t\tconst origin = await sink.getSample(0);\n\t\t\t\tconst originTimestamp = origin?.timestamp ?? await track.getFirstTimestamp();\n\t\t\t\torigin?.close();\n\t\t\t\tstartIndex = Math.round((firstTimestamp - originTimestamp) * sampleRate);\n\t\t\t}\n\t\t\tconst endedEarly = !range || (startIndex + totalFrames) / sampleRate < range.endSec;\n\t\t\treturn {\n\t\t\t\tchannels,\n\t\t\t\tsampleRate,\n\t\t\t\tstartIndex,\n\t\t\t\tvalidFromSec: decodeFromSec > 0 && range ? range.startSec : 0,\n\t\t\t\tvalidToSec: endedEarly || !range ? Number.POSITIVE_INFINITY : range.endSec\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (err instanceof Error && err.message.includes(\"Cannot open local media file\")) throw err;\n\t\t\tif (typeof process !== \"undefined\" && process.versions?.node) try {\n\t\t\t\tconst { execFileSync } = await import(\"node:child_process\");\n\t\t\t\tconst ffStartIndex = range ? Math.round(Math.max(0, range.startSec) * 48e3) : 0;\n\t\t\t\tconst ffStartSec = ffStartIndex / 48e3;\n\t\t\t\tconst stdout = execFileSync(\"ffmpeg\", [\n\t\t\t\t\t\"-v\",\n\t\t\t\t\t\"error\",\n\t\t\t\t\t...ffStartSec > 0 ? [\"-ss\", String(ffStartSec)] : [],\n\t\t\t\t\t\"-i\",\n\t\t\t\t\turl,\n\t\t\t\t\t...range ? [\"-t\", String(range.endSec - ffStartSec)] : [],\n\t\t\t\t\t\"-f\",\n\t\t\t\t\t\"f32le\",\n\t\t\t\t\t\"-ar\",\n\t\t\t\t\t\"48000\",\n\t\t\t\t\t\"-ac\",\n\t\t\t\t\t\"2\",\n\t\t\t\t\t\"pipe:1\"\n\t\t\t\t], { maxBuffer: Number.POSITIVE_INFINITY });\n\t\t\t\tconst totalSamples = stdout.byteLength / 4;\n\t\t\t\tconst numFrames = totalSamples / 2;\n\t\t\t\tconst interleaved = new Float32Array(stdout.buffer, stdout.byteOffset, totalSamples);\n\t\t\t\tconst left = new Float32Array(numFrames);\n\t\t\t\tconst right = new Float32Array(numFrames);\n\t\t\t\tfor (let i = 0; i < numFrames; i++) {\n\t\t\t\t\tleft[i] = interleaved[i * 2];\n\t\t\t\t\tright[i] = interleaved[i * 2 + 1];\n\t\t\t\t}\n\t\t\t\tconst ffEndedEarly = !range || ffStartSec + numFrames / 48e3 < range.endSec;\n\t\t\t\treturn {\n\t\t\t\t\tchannels: [left, right],\n\t\t\t\t\tsampleRate: 48e3,\n\t\t\t\t\tstartIndex: ffStartIndex,\n\t\t\t\t\tvalidFromSec: ffStartSec,\n\t\t\t\t\tvalidToSec: ffEndedEarly || !range ? Number.POSITIVE_INFINITY : range.endSec\n\t\t\t\t};\n\t\t\t} catch (ffmpegErr) {\n\t\t\t\tmediaLogger.warn({ ffmpegErr }, `[AudioExtractor] ffmpeg fallback decode failed for ${url}`);\n\t\t\t}\n\t\t\tmediaLogger.error({ err }, `[AudioExtractor] Failed to decode source ${url}`);\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tif (inputAcquired) inputStore.release(url);\n\t\t}\n\t} catch (err) {\n\t\tif (err instanceof Error && err.message.includes(\"Cannot open local media file\")) throw err;\n\t\tmediaLogger.error({ err }, `[AudioExtractor] Failed to decode source ${url}`);\n\t\treturn null;\n\t}\n}\n/** Samples the mapped source at the audio clock; holds are silent. */\nasync function resampleMappedPCM(input, sourceRate, outputRate, length, inputStart, map, startFrame, fps) {\n\tconst output = new Float32Array(length);\n\tfor (let i = 0; i < length; i++) {\n\t\tif (i > 0 && i % 1e5 === 0) await yieldToMain();\n\t\tconst frame = startFrame + i / outputRate * fps;\n\t\tif (mediaSourceIsHold(map, frame)) continue;\n\t\tconst position = mediaSourceTime(map, frame, fps) * sourceRate - inputStart;\n\t\tconst index = Math.floor(position);\n\t\tif (index < 0 || index >= input.length) continue;\n\t\tconst a = input[index];\n\t\toutput[i] = a + ((input[index + 1] ?? a) - a) * (position - index);\n\t}\n\treturn output;\n}\n/**\n* Resamples a PCM buffer using linear interpolation to target sample rate & speed.\n* `trimOffsetSamples` is a whole-file index; `inputStartIndex` is the\n* whole-file index of `inputChannel[0]` when it holds only a range.\n*/\nasync function resampleAndStretchPCM(inputChannel, sourceSampleRate, targetSampleRate, speed, outputLength, trimOffsetSamples, inputStartIndex = 0) {\n\tconst output = new Float32Array(outputLength);\n\tconst factor = sourceSampleRate / targetSampleRate * speed;\n\tconst YIELD_INTERVAL = 1e5;\n\tfor (let i = 0; i < outputLength; i++) {\n\t\tif (i > 0 && i % YIELD_INTERVAL === 0) await yieldToMain();\n\t\tconst srcIndex = trimOffsetSamples + i * factor - inputStartIndex;\n\t\tconst indexFloor = Math.floor(srcIndex);\n\t\tconst indexCeil = Math.ceil(srcIndex);\n\t\tif (indexFloor < 0) {\n\t\t\toutput[i] = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (indexFloor >= inputChannel.length) break;\n\t\tconst weight = srcIndex - indexFloor;\n\t\tconst sampleFloor = inputChannel[indexFloor] ?? 0;\n\t\tconst val = sampleFloor + weight * ((indexCeil >= 0 && indexCeil < inputChannel.length ? inputChannel[indexCeil] ?? sampleFloor : sampleFloor) - sampleFloor);\n\t\toutput[i] = Number.isFinite(val) ? val : 0;\n\t}\n\treturn output;\n}\n/** Seconds decoded past a clip's last source sample, for interpolation. */\nconst RANGE_MARGIN_SEC = .05;\n/** Processors that only scale what is already there, so silence stays silence. */\nconst GAIN_ONLY_PROCESSORS = new Set([\"Compositor\", \"CompositorLayer\"]);\n/** Adds `src` into `dest` starting at `destStart` (which may be negative). */\nfunction addInto(dest, src, destStart) {\n\tconst from = Math.max(0, -destStart);\n\tconst to = Math.min(src.length, dest.length - destStart);\n\tfor (let i = from; i < to; i++) dest[destStart + i] += src[i];\n}\n/**\n* A node's stereo mix, allocated on first write. A child that covers the\n* whole bus while it is still silent is taken over instead of copied (adding\n* into silence changes nothing), so a chain of single-child nodes passes one\n* buffer up instead of allocating and summing a full-length copy per level.\n*/\nvar MixBus = class {\n\tchannels = null;\n\tconstructor(length) {\n\t\tthis.length = length;\n\t}\n\t/** The bus channels, allocated (silent) if nothing was written yet. */\n\tget() {\n\t\tthis.channels ??= [new Float32Array(this.length), new Float32Array(this.length)];\n\t\treturn this.channels;\n\t}\n\t/** Whether `src` written at `start` could replace the bus outright. */\n\tcanAdopt(src, start) {\n\t\treturn this.channels === null && start === 0 && src.every((ch) => ch.length === this.length);\n\t}\n\t/** Mixes `src` into the bus starting at sample `start`. */\n\tadd(src, start) {\n\t\tif (this.canAdopt(src, start) && src[0] !== src[1]) {\n\t\t\tthis.channels = src;\n\t\t\treturn;\n\t\t}\n\t\tconst dest = this.get();\n\t\tfor (let c = 0; c < 2; c++) addInto(dest[c], src[c], start);\n\t}\n};\n/** A clip's file name for progress, without paths or signed-URL queries. */\nfunction sourceLabel(url) {\n\tif (url.startsWith(\"data:\")) return \"inline audio\";\n\tconst name = url.split(/[?#]/)[0].split(/[\\\\/]/).pop();\n\treturn name ? decodeURIComponentSafe(name) : \"audio\";\n}\nfunction decodeURIComponentSafe(s) {\n\ttry {\n\t\treturn decodeURIComponent(s);\n\t} catch {\n\t\treturn s;\n\t}\n}\n/**\n* Recursively parses the VirtualMediaData tree and mixes all active audio tracks\n* into a single unified stereo PCM stream (Float32Array channels).\n*/\nasync function mixAudioTracks(virtualMedia, fps, targetSampleRate = 48e3, device, renderId, options = {}) {\n\tmediaLogger.debug(`[AudioExtractor] mixAudioTracks started. FPS: ${fps}, targetSampleRate: ${targetSampleRate}`);\n\tawait waitForDelayRender();\n\tshaderStore.registerSignalsFromComposition(renderId, virtualMedia);\n\tconst durationMs = getActiveMediaMetadata(virtualMedia)?.durationMs || 1e3;\n\tconst totalDurationSec = durationMs / 1e3;\n\tconst totalTargetSamples = Math.ceil(totalDurationSec * targetSampleRate);\n\tmediaLogger.debug(`[AudioExtractor] Composition total duration: ${durationMs}ms (${totalDurationSec}s). Total mixed samples to allocate: ${totalTargetSamples}`);\n\tconst decodedCache = /* @__PURE__ */ new Map();\n\tconst undecodable = /* @__PURE__ */ new Set();\n\tasync function getDecodedRange(url, startSec, endSec, cache = true) {\n\t\tif (undecodable.has(url)) return null;\n\t\tlet ranges = decodedCache.get(url);\n\t\tconst hit = cache ? ranges?.find((r) => r.validFromSec <= startSec && r.validToSec >= endSec) : void 0;\n\t\tif (hit) return hit;\n\t\tconst decoded = await decodeAudioRange(url, {\n\t\t\tstartSec,\n\t\t\tendSec\n\t\t});\n\t\tif (!decoded) {\n\t\t\tundecodable.add(url);\n\t\t\treturn null;\n\t\t}\n\t\tif (!cache) return decoded;\n\t\tif (!ranges) {\n\t\t\tranges = [];\n\t\t\tdecodedCache.set(url, ranges);\n\t\t}\n\t\tranges.push(decoded);\n\t\treturn decoded;\n\t}\n\tasync function mappedChannels(url, length, map, startFrame) {\n\t\tconst left = new Float32Array(length), right = new Float32Array(length);\n\t\tfor (let offset = 0; offset < length;) {\n\t\t\tlet count = Math.min(length - offset, targetSampleRate * 2);\n\t\t\tconst first = startFrame + offset / targetSampleRate * fps;\n\t\t\tlet range = mediaSourceRange(map, first, first + (count - 1) / targetSampleRate * fps, fps);\n\t\t\twhile (range.max - range.min > 3 && count > 1) {\n\t\t\t\tcount = Math.max(1, Math.floor(count / 2));\n\t\t\t\trange = mediaSourceRange(map, first, first + (count - 1) / targetSampleRate * fps, fps);\n\t\t\t}\n\t\t\tconst decoded = await getDecodedRange(url, range.min, range.max + RANGE_MARGIN_SEC, false);\n\t\t\tif (!decoded) return null;\n\t\t\tconst a = await resampleMappedPCM(decoded.channels[0], decoded.sampleRate, targetSampleRate, count, decoded.startIndex, map, first, fps);\n\t\t\tconst b = decoded.channels.length > 1 ? await resampleMappedPCM(decoded.channels[1], decoded.sampleRate, targetSampleRate, count, decoded.startIndex, map, first, fps) : a;\n\t\t\tleft.set(a, offset);\n\t\t\tright.set(b, offset);\n\t\t\toffset += count;\n\t\t}\n\t\treturn [left, right];\n\t}\n\tconst audibleCache = /* @__PURE__ */ new WeakMap();\n\tfunction isAudible(node) {\n\t\tconst cached = audibleCache.get(node);\n\t\tif (cached !== void 0) return cached;\n\t\tconst op = node.operation;\n\t\tlet audible = false;\n\t\tif (op?.op === \"source\") {\n\t\t\tconst mediaType = getMediaType(node);\n\t\t\taudible = mediaType === \"Audio\" || mediaType === \"Video\";\n\t\t} else if (op?.op && !GAIN_ONLY_PROCESSORS.has(op.op) && audioRegistry.get(op.op)) audible = true;\n\t\tif (!audible && node.children) audible = node.children.some((child) => child && isAudible(child));\n\t\taudibleCache.set(node, audible);\n\t\treturn audible;\n\t}\n\tasync function traverse(node, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, inheritedDurationFrames, inheritedRemap) {\n\t\tif (!node || !isAudible(node)) return null;\n\t\tconst op = node.operation;\n\t\tif (!op) {\n\t\t\tconst durationMs$1 = getActiveMediaMetadata(node)?.durationMs ?? 0;\n\t\t\tconst durationFrames = Math.round(durationMs$1 / 1e3 * fps);\n\t\t\tconst actualDurationFrames = inheritedRemap && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? durationFrames > 0 ? Math.min(inheritedDurationFrames, durationFrames) : inheritedDurationFrames : durationFrames;\n\t\t\tconst localSamplesCount$1 = Math.ceil(actualDurationFrames / fps * targetSampleRate);\n\t\t\tif (localSamplesCount$1 <= 0) return null;\n\t\t\tconst bus$1 = new MixBus(localSamplesCount$1);\n\t\t\tfor (const child of node.children) {\n\t\t\t\tconst childChannels = await traverse(child, inheritedSeekSec, inheritedClockFrames, inheritedVolume, inheritedSpeed, actualDurationFrames, inheritedRemap);\n\t\t\t\tif (childChannels) {\n\t\t\t\t\tconst childOp = child.operation;\n\t\t\t\t\tconst childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;\n\t\t\t\t\tconst childStartSample = Math.round(childStartFrame / fps * targetSampleRate);\n\t\t\t\t\tbus$1.add(childChannels, childStartSample);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn bus$1.channels;\n\t\t}\n\t\tconst volume = inheritedVolume * (op.volume ?? 1) * (op.opacity === 0 ? 0 : 1) * (op.muted ? 0 : 1);\n\t\tconst speedMultiplier = inheritedSpeed;\n\t\tconst nodeStartFrame = op.startFrame ?? op.timeline?.startFrame ?? 0;\n\t\tconst ownRemap = op.timeRemap;\n\t\tconst remap = ownRemap ? {\n\t\t\tmap: ownRemap,\n\t\t\toffsetFrames: 0\n\t\t} : inheritedRemap ? {\n\t\t\tmap: inheritedRemap.map,\n\t\t\toffsetFrames: inheritedRemap.offsetFrames + nodeStartFrame\n\t\t} : void 0;\n\t\tconst localClockFrames = op.op === \"CompositorLayer\" ? nodeStartFrame : inheritedClockFrames + nodeStartFrame;\n\t\tconst segments = op.timeline?.segments || [];\n\t\tconst layer = op;\n\t\tconst layerTrimSec = layer.op === \"CompositorLayer\" ? (layer.mediaStartFrame ?? layer.trimStartFrames ?? null) !== null ? (layer.mediaStartFrame ?? layer.trimStartFrames ?? 0) / fps : Math.round((layer.trimStartSec ?? 0) * fps) / fps : 0;\n\t\tconst nodeDurationMs = getActiveMediaMetadata(node)?.durationMs ?? 0;\n\t\tconst nodeDurationFrames = Math.round(nodeDurationMs / 1e3 * fps);\n\t\tconst nodeActualDurationFrames = inheritedRemap && !ownRemap && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? nodeDurationFrames > 0 ? Math.min(inheritedDurationFrames, nodeDurationFrames) : inheritedDurationFrames : nodeDurationFrames;\n\t\tconst localSamplesCount = Math.ceil(nodeActualDurationFrames / fps * targetSampleRate);\n\t\tif (localSamplesCount <= 0) return null;\n\t\tconst bus = new MixBus(localSamplesCount);\n\t\tconst processSegment = async (seg, windowStartFrameOffset) => {\n\t\t\tconst segSeekSec = seg ? seg.startSec : 0;\n\t\t\tconst totalSeekSec = inheritedSeekSec + layerTrimSec + segSeekSec;\n\t\t\tconst totalClockFrames = localClockFrames + windowStartFrameOffset;\n\t\t\tlet segDurationFrames = 0;\n\t\t\tif (seg) segDurationFrames = Math.max(1, Math.round(((seg.endSec ?? 0) - seg.startSec) * fps));\n\t\t\telse segDurationFrames = nodeDurationFrames;\n\t\t\tconst actualDurationFrames = inheritedRemap && !ownRemap && !seg && inheritedDurationFrames !== null ? inheritedDurationFrames : inheritedDurationFrames !== null ? Math.min(inheritedDurationFrames, segDurationFrames) : segDurationFrames;\n\t\t\tconst segmentStartSample = Math.round(windowStartFrameOffset / fps * targetSampleRate);\n\t\t\tif (op.op === \"source\") {\n\t\t\t\tconst mediaType = getMediaType(node);\n\t\t\t\tconst params = computeRenderParams(node);\n\t\t\t\tif (params.sourceUrl && (mediaType === \"Audio\" || mediaType === \"Video\") && volume > 0) {\n\t\t\t\t\tconst finalSpeed = Math.max(.5, speedMultiplier * (Number(params.speed) || 1));\n\t\t\t\t\tconst effectiveTrimSec = Math.max(0, (Number(params.trimStartSec) || 0) + totalSeekSec);\n\t\t\t\t\tconst clipDurationSec = actualDurationFrames / fps;\n\t\t\t\t\tconst clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));\n\t\t\t\t\tconst mapped = remap && clipSamplesCount > 0 ? await mappedChannels(params.sourceUrl, clipSamplesCount, remap.map, remap.offsetFrames + windowStartFrameOffset) : null;\n\t\t\t\t\tconst decoded = !remap && clipSamplesCount > 0 && segmentStartSample < localSamplesCount ? await getDecodedRange(params.sourceUrl, effectiveTrimSec, effectiveTrimSec + clipSamplesCount / targetSampleRate * finalSpeed + RANGE_MARGIN_SEC) : null;\n\t\t\t\t\tif (mapped || decoded) {\n\t\t\t\t\t\tlet stretchedLeft;\n\t\t\t\t\t\tlet stretchedRight;\n\t\t\t\t\t\tif (mapped) [stretchedLeft, stretchedRight] = mapped;\n\t\t\t\t\t\telse if (decoded) {\n\t\t\t\t\t\t\tconst trimOffsetSamples = Math.round(effectiveTrimSec * decoded.sampleRate);\n\t\t\t\t\t\t\tstretchedLeft = await resampleAndStretchPCM(decoded.channels[0], decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples, decoded.startIndex);\n\t\t\t\t\t\t\tstretchedRight = decoded.channels.length > 1 ? await resampleAndStretchPCM(decoded.channels[1], decoded.sampleRate, targetSampleRate, finalSpeed, clipSamplesCount, trimOffsetSamples, decoded.startIndex) : stretchedLeft;\n\t\t\t\t\t\t} else throw new Error(\"No decoded audio\");\n\t\t\t\t\t\tconst stretched = [stretchedLeft, stretchedRight];\n\t\t\t\t\t\tif (bus.canAdopt(stretched, segmentStartSample)) {\n\t\t\t\t\t\t\tif (volume !== 1) {\n\t\t\t\t\t\t\t\tfor (let i = 0; i < clipSamplesCount; i++) stretchedLeft[i] *= volume;\n\t\t\t\t\t\t\t\tif (stretchedRight !== stretchedLeft) for (let i = 0; i < clipSamplesCount; i++) stretchedRight[i] *= volume;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbus.channels = [stretchedLeft, stretchedRight === stretchedLeft ? stretchedLeft.slice() : stretchedRight];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst [localLeft, localRight] = bus.get();\n\t\t\t\t\t\t\tfor (let i = 0; i < clipSamplesCount; i++) {\n\t\t\t\t\t\t\t\tconst outIndex = segmentStartSample + i;\n\t\t\t\t\t\t\t\tlocalLeft[outIndex] += stretchedLeft[i] * volume;\n\t\t\t\t\t\t\t\tlocalRight[outIndex] += stretchedRight[i] * volume;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tawait yieldToMain();\n\t\t\t\t}\n\t\t\t\tif (mediaType === \"Audio\" || mediaType === \"Video\") {\n\t\t\t\t\tclipsDone++;\n\t\t\t\t\toptions.onProgress?.({\n\t\t\t\t\t\tdone: clipsDone,\n\t\t\t\t\t\ttotal: clipsTotal,\n\t\t\t\t\t\t...params.sourceUrl && { source: sourceLabel(params.sourceUrl) }\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (node.children) for (const child of node.children) {\n\t\t\t\tconst childChannels = await traverse(child, totalSeekSec, totalClockFrames, volume, speedMultiplier, actualDurationFrames, remap);\n\t\t\t\tif (childChannels) {\n\t\t\t\t\tconst childOp = child.operation;\n\t\t\t\t\tconst childStartFrame = childOp?.startFrame ?? childOp?.timeline?.startFrame ?? 0;\n\t\t\t\t\tconst relativeStartFrame = op.op === \"CompositorLayer\" && childOp?.op === \"CompositorLayer\" ? childStartFrame - nodeStartFrame : childStartFrame;\n\t\t\t\t\tconst childStartSample = Math.round(relativeStartFrame / fps * targetSampleRate);\n\t\t\t\t\tbus.add(childChannels, segmentStartSample + childStartSample);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst pluginProcessor = audioRegistry.get(op.op);\n\t\t\tif (pluginProcessor) try {\n\t\t\t\tconst clipDurationSec = actualDurationFrames / fps;\n\t\t\t\tconst clipSamplesCount = Math.min(localSamplesCount - segmentStartSample, Math.ceil(clipDurationSec * targetSampleRate));\n\t\t\t\tif (clipSamplesCount > 0 && segmentStartSample < localSamplesCount && segmentStartSample >= 0) await pluginProcessor(bus.get().map((ch) => ch.subarray(segmentStartSample, segmentStartSample + clipSamplesCount)), targetSampleRate, node, {\n\t\t\t\t\tdevice,\n\t\t\t\t\tframe: totalClockFrames,\n\t\t\t\t\tfps,\n\t\t\t\t\trenderId,\n\t\t\t\t\telapsedMs: ((totalClockFrames - (op.op === \"CompositorLayer\" ? localClockFrames : 0)) / fps + totalSeekSec - layerTrimSec) * 1e3,\n\t\t\t\t\tdurationMs: getActiveMediaMetadata(node)?.durationMs ?? void 0\n\t\t\t\t});\n\t\t\t} catch (pluginErr) {\n\t\t\t\tmediaLogger.error({ err: pluginErr }, `[AudioExtractor] Custom plugin for operation '${op.op}' failed`);\n\t\t\t}\n\t\t};\n\t\tif (segments.length > 0) {\n\t\t\tlet currentStart = 0;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst durSec = (seg.endSec ?? 0) - seg.startSec;\n\t\t\t\tconst durFrames = Math.max(1, Math.round(durSec * fps));\n\t\t\t\tawait processSegment(seg, currentStart);\n\t\t\t\tcurrentStart += durFrames;\n\t\t\t}\n\t\t} else await processSegment(null, 0);\n\t\treturn bus.channels;\n\t}\n\tconst normalized = normalizeTimeline(virtualMedia, fps);\n\tlet clipsTotal = 0;\n\tlet clipsDone = 0;\n\tif (options.onProgress) {\n\t\tconst count = (node) => {\n\t\t\tif (!node) return;\n\t\t\tconst op = node.operation;\n\t\t\tif (op?.op === \"source\") {\n\t\t\t\tconst mediaType = getMediaType(node);\n\t\t\t\tif (mediaType === \"Audio\" || mediaType === \"Video\") clipsTotal += Math.max(1, op.timeline?.segments?.length ?? 0);\n\t\t\t}\n\t\t\tfor (const child of node.children ?? []) count(child);\n\t\t};\n\t\tcount(normalized);\n\t\toptions.onProgress({\n\t\t\tdone: 0,\n\t\t\ttotal: clipsTotal\n\t\t});\n\t}\n\tconst rootChannels = await traverse(normalized, 0, 0, 1, 1, null);\n\tconst mixedChannels = rootChannels?.every((ch) => ch.length === totalTargetSamples) && rootChannels[0] !== rootChannels[1] ? rootChannels : [new Float32Array(totalTargetSamples), new Float32Array(totalTargetSamples)];\n\tconst [outputLeft, outputRight] = mixedChannels;\n\tif (rootChannels && mixedChannels !== rootChannels) for (let c = 0; c < 2; c++) {\n\t\tconst dest = mixedChannels[c];\n\t\tconst src = rootChannels[c];\n\t\tconst len = Math.min(src.length, dest.length);\n\t\tfor (let i = 0; i < len; i++) dest[i] = src[i];\n\t}\n\tdecodedCache.clear();\n\tlet mixPeak = 0;\n\tfor (let i = 0; i < totalTargetSamples; i++) {\n\t\tconst l = Math.abs(outputLeft[i] ?? 0);\n\t\tconst r = Math.abs(outputRight[i] ?? 0);\n\t\tif (l > mixPeak) mixPeak = l;\n\t\tif (r > mixPeak) mixPeak = r;\n\t}\n\tconst autoGain = mixPeak > .95 ? .92 / mixPeak : 1;\n\tfor (let i = 0; i < totalTargetSamples; i++) {\n\t\tconst l = (outputLeft[i] ?? 0) * autoGain;\n\t\tconst r = (outputRight[i] ?? 0) * autoGain;\n\t\toutputLeft[i] = Number.isFinite(l) ? Math.tanh(l) : 0;\n\t\toutputRight[i] = Number.isFinite(r) ? Math.tanh(r) : 0;\n\t}\n\treturn {\n\t\tchannels: mixedChannels,\n\t\tsampleRate: targetSampleRate\n\t};\n}\n\n//#endregion\n//#region src/utils/media-time-preflight.ts\n/** Resolve the source bound to a compositor layer, including effect wrappers. */\nfunction sourceOf(node) {\n\tif (node.operation?.op === \"source\") return computeRenderParams(node).sourceUrl;\n\tfor (const child of node.children ?? []) {\n\t\tconst source = sourceOf(child);\n\t\tif (source) return source;\n\t}\n}\n/** Verify mapped source intervals before decoding or mixing. */\nasync function preflightMediaTime(root, fps) {\n\tconst walk = async (node) => {\n\t\tconst op = node.operation;\n\t\tif (op?.op === \"CompositorLayer\" && op.timeRemap && op.durationFrames) {\n\t\t\tconst source = sourceOf(node);\n\t\t\tif (!source) throw new Error(`Time remap on '${op.id}' has no media source`);\n\t\t\tconst bounds = [];\n\t\t\tconst input = await inputStore.acquire(source);\n\t\t\ttry {\n\t\t\t\tconst video = op.dataType === \"Video\" ? await input.getPrimaryVideoTrack() : null;\n\t\t\t\tconst audio = op.dataType === \"Video\" && (op.muted || op.volume === 0) ? null : await input.getPrimaryAudioTrack();\n\t\t\t\tif (op.dataType === \"Video\" && !video) throw new Error(`Time remap on '${op.id}': source has no video track`);\n\t\t\t\tif (op.dataType === \"Audio\" && !audio) throw new Error(`Time remap on '${op.id}': source has no audio track`);\n\t\t\t\tfor (const track of [video, audio]) {\n\t\t\t\t\tif (!track) continue;\n\t\t\t\t\tbounds.push({\n\t\t\t\t\t\tfirst: await input.getFirstTimestamp([track]),\n\t\t\t\t\t\tlast: await track.computeDuration()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tinputStore.release(source);\n\t\t\t}\n\t\t\tconst check = (range) => {\n\t\t\t\tfor (const { first, last } of bounds) if (range.min < first - 1e-8 || range.max > last + 1e-8 || range.maxIncluded && range.max >= last - 1e-8) throw new Error(`Time remap on '${op.id}' requests source ${range.min.toFixed(6)}–${range.max.toFixed(6)}s outside ${first.toFixed(6)}–${last.toFixed(6)}s`);\n\t\t\t};\n\t\t\tif (op.timeRemap.kind === \"recorded\") op.timeRemap.recorder.checkRange(check);\n\t\t\telse check(mediaSourceRange(op.timeRemap, 0, op.durationFrames, fps));\n\t\t}\n\t\tfor (const child of node.children ?? []) await walk(child);\n\t};\n\tawait walk(root);\n}\n\n//#endregion\nexport { calculateLayerTransform, compositionStateStore, computeRenderParams, decodeAudioSource, drawCompositionTree, formatTimecode, framesToSeconds, isStaticVisualMedia, mixAudioTracks, normalizeTimeline, preflightMediaTime, resolveLayerDuration, secondsToFrames };\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
|