video-fps-probe 0.2.0 → 0.3.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +26 -14
  3. package/dist/api/errors.js +1 -1
  4. package/dist/api/guards.d.ts +2 -0
  5. package/dist/api/guards.js +2 -1
  6. package/dist/check/index.js +12 -2
  7. package/dist/client/compare.js +2 -2
  8. package/dist/client/create.d.ts +3 -0
  9. package/dist/client/create.js +8 -0
  10. package/dist/client/fallback.js +2 -2
  11. package/dist/client/index.d.ts +1 -1
  12. package/dist/client/index.js +1 -1
  13. package/dist/client/inline.js +1 -1
  14. package/dist/client/lazy.js +1 -1
  15. package/dist/client/probe-client.js +4 -0
  16. package/dist/client/probe.js +23 -22
  17. package/dist/client/route.js +20 -0
  18. package/dist/client/split.js +9 -0
  19. package/dist/client/stub.js +2 -2
  20. package/dist/client/types.d.ts +1 -0
  21. package/dist/core/analyze.js +4 -78
  22. package/dist/core/dispatch.js +76 -0
  23. package/dist/core/isobmff/boxes.js +4 -7
  24. package/dist/core/isobmff/index.js +8 -5
  25. package/dist/core/isobmff/model.js +1 -1
  26. package/dist/core/isobmff/moov.js +12 -7
  27. package/dist/core/isobmff/track.js +4 -2
  28. package/dist/core/matroska/ebml.js +1 -1
  29. package/dist/core/reader.d.ts +0 -12
  30. package/dist/core/reader.js +10 -27
  31. package/dist/engines/common.js +6 -0
  32. package/dist/engines/mediabunny.js +17 -4
  33. package/dist/engines/mp4box.js +2 -1
  34. package/dist/plugins/own.js +5 -2
  35. package/dist/presets/index.d.ts +1 -0
  36. package/dist/presets/sources.json +8 -0
  37. package/dist/probe.js +2 -1
  38. package/dist/react/store.js +1 -1
  39. package/dist/standalone/own-isobmff.worker.js +1 -0
  40. package/dist/standalone/own-matroska.worker.js +1 -0
  41. package/dist/standalone/own.worker.js +1 -1
  42. package/dist/worker/own-isobmff.worker.js +4 -0
  43. package/dist/worker/own-matroska.worker.js +4 -0
  44. package/dist/worker/runtime.d.ts +2 -3
  45. package/dist/worker/runtime.js +2 -97
  46. package/dist/worker/serve.d.ts +3 -0
  47. package/dist/worker/serve.js +97 -0
  48. package/dist/worker/single.js +13 -0
  49. package/package.json +8 -2
  50. package/dist/client/inline.d.ts +0 -19
  51. package/dist/client/pool.d.ts +0 -29
  52. package/dist/client/probe.d.ts +0 -29
@@ -0,0 +1 @@
1
+ (function(){var e=Object.defineProperty,t=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},n=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};function r(e,t){let n={...e};if(!t)return n;for(let e of Object.keys(t)){let r=t[e];r!==void 0&&(n[e]=r)}return n}function i(e={}){return{signal:e.signal??null,matroskaMode:e.matroskaMode??`auto`,exactBudgetMs:e.exactBudgetMs??150,readAhead:r(o,e.readAhead),costModel:r(s,e.costModel),maxExpandedSamples:e.maxExpandedSamples??5e6,onProgress:e.onProgress??null}}function a(e,t,n){return t*e.perReadMs+n/e.bytesPerMs}var o,s,c=t((()=>{o={head:65536,fragment:1048576,matroskaScan:1048576,tail:262144},s={perReadMs:.8,bytesPerMs:5e5,perBlockMs:2e-4}}));function l(e){return e<0n?-e:e}function u(e,t){for(;t!==0n;){let n=e%t;e=t,t=n}return e}function d(e,t){if(typeof e==`bigint`)return e;if(!Number.isSafeInteger(e))throw RangeError(`${t} must be a safe integer, got ${e}`);return BigInt(e)}function f(e,t,n=v){let r=d(e,`num`),i=d(t,`den`),a=d(n,`max`),o=0n,s=1n,c=1n,f=0n,p=r<0n!=i<0n,m=u(l(r),l(i));for(m!==0n&&(r=l(r)/m,i=l(i)/m),r<=a&&i<=a&&(c=r,f=i,i=0n);i!==0n;){let e=r/i,t=r-i*e,n=e*c+o,l=e*f+s;if(n>a||l>a){if(c!==0n&&(e=(a-o)/c),f!==0n){let t=(a-s)/f;t<e&&(e=t)}i*(2n*e*f+s)>r*f&&(c=e*c+o,f=e*f+s);break}o=c,s=f,c=n,f=l,r=i,i=t}let h=Number(c);return{num:p?-h:h,den:Number(f),exact:i===0n}}function p(e){return e.den===0?0:e.num/e.den}function m(e){return e?`${e.num}/${e.den}`:`0/0`}function h(e,t){return{num:e,den:t,value:p({num:e,den:t})}}function g(e,t,n=v){let r=f(e,t,n);return h(r.num,r.den)}function _(e,t,n){return t<=0||n<=0||e<=0?null:g(BigInt(e)*BigInt(t),n,v)}var v,y=t((()=>{v=2147483647}));c(),y();function b(e,t=null){return{container:e,brand:null,formatDurationSec:null,scan:null,videoTracks:[],audioTrackCount:0,primaryTrackId:null,error:t,warnings:[]}}function x(e){return{trackId:e,fourccOrCodecId:``,codecName:``,width:0,height:0,rotation:0,timescale:0,frames:null,presentedFrames:null,durationSec:null,startSec:null,avgFps:null,avgFpsFfprobe:null,rFpsFfprobe:null,nominalFps:null,dominantFps:null,minFps:null,maxFps:null,isVfr:null,vfrRatio:0,distinctDeltas:0,duplicateTimestamps:0,timestampsQuantized:!1,isStill:!1,rateProfile:null,provenance:{},warnings:[]}}var S=n({CUSUM_ALARM_PERIODS:()=>2,FREEZE_FACTOR:()=>4,FREEZE_MIN_SEC:()=>De,MAX_ANOMALIES:()=>50,MAX_BUCKETS:()=>120,MAX_SEGMENTS:()=>50,MIN_SEGMENT_FRAMES:()=>5,MIN_SEGMENT_SEC:()=>w,UNEVEN_DOMINANT_SHARE:()=>T,rateProfile:()=>k});function C(e,t,n){e.t0=Math.min(e.t0,t.t0),e.t1=Math.max(e.t1,t.t1),e.frames+=t.frames,n?(e.n+=t.n,e.sum+=t.sum,e.ex+=t.ex):e.ex+=t.t1-t.t0}var w,T,E,D,O,k,ee=t((()=>{ke(),w=.5,T=.8,E=1+Te,D=e=>String(+e.toPrecision(4)),O=e=>({t0:e,t1:e,n:0,sum:0,frames:0,ex:0,d:0,kind:`steady`}),k=(e,t,n,r)=>{let i=t,a=De*i,o=e=>i*e.n/e.sum,s=e=>e.n>=5&&e.t1-e.t0>=.5*i,c=[],l=e=>{let t=c[c.length-1];s(e)?c.push(e):t?.kind===`short`?C(t,e,!0):c.push({...e,kind:`short`})},u=O(0),d=O(0),f=O(0),p=0,m=0,h=0,g=0,_=0,v=!1,y=()=>{u.t1=p,v?c.push({...u,kind:`hold`}):l(u),u=O(p),v=!1,g=_=0},b=Math.min(120,Math.floor(n/2)),x=r/b,S=new Float64Array(b),w=(e,t)=>{u.n+=e,u.sum+=e*t,u.frames+=e,p+=e*t},T=(e,t)=>{let n=e;if(t<=0)u.frames+=n,h+=n;else{for(let e=p,r=e+n*t,i=Math.floor(e/x);e<r&&i<b;i++){let n=Math.min(r,(i+1)*x);n>e&&(S[i]+=(n-e)/t),e=Math.max(e,n)}for(;n>0;){let e=u.sum/u.n;if(u.n&&t>=Math.max(a,4*e)){y(),v=!0,w(1,t),n--;continue}if(v&&Math.abs(t-e)>.075*e&&y(),v=!1,!u.n){w(n,t);return}let r=t-e,i=Ee*e,o=2*e,s=Math.abs(r)>i,c=s?1:n;if(s&&(r>0?!g||r-i>o:!_)){let e={...u,t1:p,d:t};r>0?d=e:f=e}if(g=Math.max(0,g+c*(r-i)),_=Math.max(0,_-c*(r+i)),w(c,t),n-=c,g>o||_>o){let e=g>o?d:f,t=u.n-e.n-1;t>0&&Math.abs(Math.log(e.d*e.n/e.sum))<Math.abs(Math.log(e.d*t/(u.sum-e.sum-e.d)))&&(e.t1+=e.d,e.n++,e.sum+=e.d,e.frames++),u.t0=e.t1,u.n-=e.n,u.sum-=e.sum,u.frames-=e.frames,l(e),g=_=0}}}},k=0,ee=0;if(e((e,t)=>{e>0&&(m+=e,k&&t!==ee&&(T(k,ee),k=0),k+=e,ee=t)}),k&&T(k,ee),!(p>0))return null;u.n?y():c[c.length-1].frames+=u.frames;let A=[],te=(e,t,n,r,a=t.t1-t.t0)=>{A.push({kind:e,atSec:t.t0/i,durationSec:a/i,fromFps:n,toFps:r})},j=[],ne=(e,t)=>e?Math.abs(Math.log(o(e)/t)):1/0;c.forEach((e,t)=>{let n=j[j.length-1];if(e.kind===`short`||e.kind===`hold`){let r=o(e),i=c[t+1]?.kind===`steady`?c[t+1]:void 0,l=ne(n,r)<=ne(i,r)?n:i;if(e.kind=s(e)?`variable`:`steady`,e.kind===`steady`&&l){let t=o(l),n=e.sum>=e.n*Math.max(a,4*l.sum/l.n)?`freeze`:r*E<t?`gap`:r>t*E?`burst`:null;n&&te(n,e,t,r),C(l,e,!n);return}}let r=n?o(e)/o(n):0;n?.kind===`steady`&&e.kind===`steady`&&r<E&&r*E>1?C(n,e,!0):j.push(e)});let M=j[j.length-1],re=p+M.sum/M.n;M.frames+=n-m,M.t1=re;for(let e=1;e<j.length;e++){let t=j[e-1],n=j[e],r=o(n)/o(t);(t.kind===`steady`&&n.kind===`steady`||r>=E||r*E<=1)&&te(`rate-change`,n,o(t),o(n),0)}A.sort((e,t)=>e.atSec-t.atSec);let N=j.filter(e=>e.kind===`steady`).map(e=>[o(e),e.t1-e.t0-e.ex,e.n]).sort((e,t)=>e[0]-t[0]),P=0,F=0,I=0,L=0,R=0;for(let[e,t,n]of N){for(I+=t,L+=n;e>=N[R][0]*E;R++)I-=N[R][1],L-=N[R][2];P=Math.max(P,I),F=Math.max(F,L)}let ie=P/re,ae=ie<.8||F<.8*(m-h)||N.length>1&&N[N.length-1][0]>=N[0][0]*E,oe=j.slice(0,3).map(e=>`${e.kind===`variable`?`~`:``}${D(o(e))} fps for ${D((e.t1-e.t0)/i)} s`);j.length>3&&oe.push(`+${j.length-3} more`);let z=``,se=(e,t)=>{e&&(z+=`${z?`, `:`; `}${e} ${t}${e>1?`s`:``}`)};for(let e of[`freeze`,`gap`,`burst`])se(A.filter(t=>t.kind===e).length,e);return se(h,`duplicate timestamp`),{segments:j.slice(0,50).map(e=>({startSec:e.t0/i,endSec:e.t1/i,frames:e.frames,fps:o(e),kind:e.kind})),moreSegments:Math.max(0,j.length-50),anomalies:A.slice(0,50),moreAnomalies:Math.max(0,A.length-50),buckets:{bucketSec:x/i,fps:Array.from(S,e=>e*i/x)},uneven:ae,dominantShare:ie,summary:`${ae?`Uneven`:z?`Mostly steady`:`Steady`}: ${oe.join(`, `)}${z}`}}})),A=n({CUSUM_DRIFT:()=>Ee,FREEZE_FACTOR:()=>4,FREEZE_MIN_SEC:()=>De,MAX_REORDER_DEPTH:()=>16,RATE_CHANGE_RELATIVE:()=>Te,SNAP_RELATIVE_TOLERANCE:()=>Ce,VFR_RELATIVE_TOLERANCE:()=>we,analyzeTimeline:()=>P,msGridTicks:()=>j,rateFromTicks:()=>N,rateProfileOf:()=>de,reorderDepthFromCts:()=>M,snapToStandardRate:()=>te,vfrTolerance:()=>ne});function te(e,t=Ce){if(!(e>0))return null;let n=null,r=1/0;for(let t of Oe){let i=Math.abs(e-t.value)/t.value;i<r&&(r=i,n=t)}return r<=t?n:null}function j(e,t){if(!(e>1e3)||t.length===0)return 0;for(let n of t){let t=n*1e3;if(!Number.isSafeInteger(t)||t%e!==0)return 0}return e/1e3}function ne(e,t,n){return Math.max(1,Math.round(we*e),j(t,n))}function M(e,t,n){return!(t>e)||!(n>0)?0:Math.min(16,Math.ceil((t-e)/n))}function re(e){if(Number.isInteger(e)||!(e>0))return null;let t=1e9/e,n=Math.round(t);return n>0&&Math.abs(t-n)<=1e-6*n?n:null}function N(e,t){let n=re(e);return n!==null&&t>0&&Number.isSafeInteger(n*t)?g(1e9,n*t,2**53-1):L(e,t,2**53-1)}function P(e){let t=[],n=ie(e.timescale,t);return`segments`in e?ve(e,n,t):Se(e,n,t)}function F(e){return`counts`in e&&`deltas`in e?{n:Math.min(e.counts.length,e.deltas.length),counts:e.counts,values:e.deltas}:{n:e.length,counts:null,values:e}}function I(e){return e?`counts`in e&&`offsets`in e?{n:Math.min(e.counts.length,e.offsets.length),counts:e.counts,values:e.offsets}:{n:e.length,counts:null,values:e}:null}function L(e,t,n=v){if(!(e>0)||!(t>0))return null;if(Number.isSafeInteger(e)&&Number.isSafeInteger(t))return g(e,t,n);let r=1e6,i=Math.round(e*r),a=Math.round(t*r);return Number.isSafeInteger(i)&&Number.isSafeInteger(a)?g(i,a,n):h(e/t,1)}function R(e,t,n){if(!(t>0)||!(n>0))return null;let r=re(e);return r!==null&&Number.isSafeInteger(t)&&Number.isSafeInteger(n)?g(BigInt(t)*1000000000n,BigInt(r)*BigInt(n),v):Number.isSafeInteger(e)&&Number.isSafeInteger(t)&&Number.isSafeInteger(n)?g(BigInt(e)*BigInt(t),n,v):L(e*t,n)}function ie(e,t){return e>0&&Number.isFinite(e)?e:(t.push(`invalid timescale ${e}, using 1`),1)}function ae(e){return e?{ws:e.start,we:e.end>e.start?e.end:1/0}:{ws:-1/0,we:1/0}}function oe(e,t){return{timescale:e,sampleCount:0,durationSum:0,avgFps:null,avgFpsString:`0/0`,presentedAvgFps:null,presentedFrames:null,firstPts:null,lastPts:null,deltaCount:0,excludedTailDeltas:0,reorderDepth:0,duplicateTimestamps:0,discontinuities:0,histogram:[],distinctDeltas:0,minDelta:null,maxDelta:null,medianDelta:null,meanDelta:null,tolerance:null,minFps:null,maxFps:null,isVfr:null,vfrRatio:0,nominalFps:null,dominantFps:null,timestampsQuantized:!1,profile:null,fastPath:!1,warnings:t}}function z(e,t,n,r,i,a){let o=e.timescale,s=e.isVfr===!1&&n-t<=(e.tolerance??0)&&n<2*t;return n>t*1.075&&!s?e=>e(r,o,i,a):null}function se(e,t){let n=e.medianDelta,r=e.timescale;!n||!t||t<4*n||t<.5*r||e.warnings.push(`last frame held ${(t/r).toFixed(3)} s (${(t/n).toFixed(1)}x the median frame interval): the average is below the frame rate`)}function ce(e,t){if(se(e,t),e.presentedFrames===null||e.presentedFrames<=0||e.firstPts===null||e.lastPts===null)return;let n=t>0?t:e.medianDelta??0;e.presentedAvgFps=R(e.timescale,e.presentedFrames,e.lastPts-e.firstPts+n)}function le(e,t){let n=0;for(let[r,i]of B(e)){if(t<n+r)return i;n+=r}return 0}async function ue(){try{let{rateProfile:e}=await Promise.resolve().then(()=>(ee(),S));return e}catch{return null}}async function de(e){let t=e&&await ue();return t?e(t):null}function fe(e,t){return e-t>=2?e-t:e}function pe(e,t,n){let r=e.timescale,i=[...t.keys()].sort((e,t)=>e-t),a=i.map(e=>[e,t.get(e)??0]),o=0,s=0;for(let[e,t]of a)o+=t,s+=e*t;if(e.histogram=a,e.distinctDeltas=i.length,o===0)return;let c=0,l=i[0];for(let[e,t]of a)if(c+=t,c*2>=o){l=e;break}let u=i[0],d=0;for(let[e,t]of a)t>d&&(u=e,d=t);let f=j(r,i),p=Math.max(1,Math.round(we*l),f),m=0;for(let[e,t]of a)Math.abs(e-l)>p&&(m+=t);let h=i[0],g=i[i.length-1],_=o>=2&&m>0;if(e.minDelta=h,e.maxDelta=g,e.medianDelta=l,e.meanDelta=s/o,e.tolerance=p,e.minFps=N(r,g),e.maxFps=N(r,h),e.isVfr=_,e.vfrRatio=m/o,i.length===1){let t=N(r,h);t&&(e.nominalFps={...t,kind:`exact`})}else if(_&&d*2>=o){let t=N(r,u);t&&(e.dominantFps={rate:t,share:d/o})}e.timestampsQuantized=(n||f>0)&&!_&&i.length>1}function me(e){if(e.nominalFps||e.isVfr!==!1||e.distinctDeltas<2||!e.avgFps)return;let t=te(e.meanDelta?e.timescale/e.meanDelta:e.avgFps.value);t&&(e.nominalFps={...t,kind:`snapped`})}function he(e){let t={n:0,d:0,constantCts:!0,ctsValue:0,ctsMin:1/0,ctsMax:-1/0,firstDelta:0,negativeDurations:!1,discontinuities:0,startDts:0,ctsMismatch:0},n=!1,r=e=>{n?e!==t.ctsValue&&(t.constantCts=!1):(t.ctsValue=e,n=!0),e<t.ctsMin&&(t.ctsMin=e),e>t.ctsMax&&(t.ctsMax=e)},i=0;for(let n=0;n<e.length;n++){let a=e[n];a.baseDts!==void 0&&a.baseDts!==null&&(n===0?t.startDts=a.baseDts:a.baseDts!==i&&t.discontinuities++,i=a.baseDts);let o=F(a.durations),s=0;for(let e=0;e<o.n;e++){let n=o.counts?o.counts[e]:1;if(n<=0)continue;let r=o.values[e];s+=n,t.d+=n*r,i+=n*r,r<0&&(t.negativeDurations=!0),t.firstDelta===0&&r>0&&(t.firstDelta=r)}t.n+=s;let c=I(a.cts),l=0,u=0;if(c){for(let e=0;e<c.n;e++){let t=c.counts?c.counts[e]:1;if(t<=0)continue;u+=t;let n=Math.min(t,s-l);n<=0||(l+=n,r(c.values[e]))}u!==s&&t.ctsMismatch++}l<s&&r(0)}return n||(t.ctsMin=0,t.ctsMax=0),t}function*B(e){for(let t of e){let e=F(t.durations);for(let t=0;t<e.n;t++){let n=e.counts?e.counts[t]:1;n>0&&(yield[n,e.values[t]])}}}function ge(e,t,n,r){if(n===-1/0)return 0;if(n===1/0)return r;let i=t,a=0;for(let[t,r]of B(e)){if(r===0){if(i<n){a+=t;continue}return a}if(i+(t-1)*r<n)a+=t,i+=t*r;else return a+Math.max(0,Math.min(t,Math.ceil((n-i)/r)))}return a}function _e(e,t,n){let r=t,i=0;for(let[t,a]of B(e)){if(n<i+t)return r+(n-i)*a;i+=t,r+=t*a}return r}function ve(e,t,n){let r=e.segments,i=he(r);i.ctsMismatch>0&&n.push(`composition offsets do not match the sample count in ${i.ctsMismatch} segment(s)`),i.discontinuities>0&&n.push(`decode timestamp discontinuities: ${i.discontinuities}`),i.negativeDurations&&n.push(`negative sample durations`),Number.isSafeInteger(i.d)||n.push(`duration sum exceeds 2^53-1`);let a=oe(t,n);if(a.sampleCount=i.n,a.durationSum=i.d,a.discontinuities=i.discontinuities,a.avgFps=R(t,i.n,i.d),a.avgFpsString=m(a.avgFps),i.n===0)return a.presentedFrames=0,a;let o=e.reorderDepth??M(i.ctsMin,i.ctsMax,i.firstDelta);a.reorderDepth=o;let s=1+o,{ws:c,we:l}=ae(e.editWindow),u=e.tickQuantized??!1;if(!e.forceExpand&&i.constantCts&&i.discontinuities===0&&!i.negativeDurations){a.fastPath=!0;let e=i.startDts+i.ctsValue,t=ge(r,e,c,i.n),n=Math.max(t,ge(r,e,l,i.n));if(a.presentedFrames=n-t,n===t)return a;let o=_e(r,e,t),d=_e(r,e,n-1);a.firstPts=o,a.lastPts=d;let f=n-t-1,p=fe(f,s),m=new Map,h=0,g=1/0,_=0;for(let[e,n]of B(r)){if(h>=t+f)break;let r=Math.max(h,t),i=Math.min(h+e,t+f);if(i>r){if(n===0)a.duplicateTimestamps+=i-r;else{g=Math.min(g,n),_=Math.max(_,n);let i=Math.min(h+e,t+p);i>r&&(m.set(n,(m.get(n)??0)+(i-r)),a.deltaCount+=i-r)}}h+=e}return a.excludedTailDeltas=f-p,pe(a,m,u),me(a),ce(a,le(r,n-1)),a.profile=z(a,g,_,e=>{let n=0;for(let[i,a]of B(r)){if(n>=t+f)break;let r=Math.max(n,t),o=Math.min(n+i,t+f);o>r&&e(o-r,a),n+=i}},n-t,d-o),a}let d=e.maxExpandedSamples??5e6;if(i.n>d)return n.push(`per-sample analysis skipped: ${i.n} samples exceed the limit of ${d}`),a;let f=new Float64Array(i.n),p=0,h=0;for(let e of r){e.baseDts!==void 0&&e.baseDts!==null&&(h=e.baseDts);let t=p,n=F(e.durations);for(let e=0;e<n.n;e++){let t=n.counts?n.counts[e]:1,r=n.values[e];for(let e=0;e<t;e++)f[p++]=h,h+=r}let r=I(e.cts);if(r){let e=t;for(let t=0;t<r.n&&e<p;t++){let n=r.counts?r.counts[t]:1,i=r.values[t];for(let t=0;t<n&&e<p;t++)f[e++]+=i}}}let g=-1;for(let e=0;e<f.length;e++){let t=f[e];t>=c&&t<l&&(g<0||t>=f[g])&&(g=e)}let _=g>=0?le(r,g):0;return be(a,ye(f,c,l),s,u),ce(a,_),me(a),a}function ye(e,t,n){let r=e.length;if(t!==-1/0||n!==1/0){r=0;for(let i=0;i<e.length;i++){let a=e[i];a>=t&&a<n&&(e[r++]=a)}}let i=e.subarray(0,r);for(let e=1;e<r;e++)if(i[e]<i[e-1]){i.sort();break}return i}function be(e,t,n,r){let i=t.length;if(e.presentedFrames=i,i===0)return;e.firstPts=t[0],e.lastPts=t[i-1];let a=i-1,o=fe(a,n),s=new Map,c=1/0,l=0;for(let n=1;n<=a;n++){let r=t[n]-t[n-1];r<=0?e.duplicateTimestamps++:(c=Math.min(c,r),l=Math.max(l,r),n<=o&&(s.set(r,(s.get(r)??0)+1),e.deltaCount++))}e.excludedTailDeltas=a-o,pe(e,s,r),e.profile=z(e,c,l,e=>{for(let n=1;n<=a;n++)e(1,t[n]-t[n-1])},i,t[a]-t[0])}function xe(e){let t=-1/0,n=0;for(let r=0;r<e.length;r++){let i=e[r];i>t?t=i:t-i>n&&(n=t-i)}return n}function Se(e,t,n){let r=e.pts,i=r.length,a=oe(t,n);if(a.sampleCount=i,i===0)return a.presentedFrames=0,a;let o=1/0,s=-1/0;for(let e=0;e<i;e++){let t=r[e];t<o&&(o=t),t>s&&(s=t)}let{ws:c,we:l}=ae(e.editWindow),u=ye(Float64Array.from(r),c,l),d=e.reorderDepth;if(d===void 0){let t=0;for(let e=1;e<u.length;e++){let n=u[e]-u[e-1];if(n>0){t=n;break}}d=e.ctsRange?M(e.ctsRange.min,e.ctsRange.max,t):M(0,xe(r),t)}a.reorderDepth=d,be(a,u,1+d,e.tickQuantized??!1),se(a,e.lastDuration);let f=e.lastDuration??a.medianDelta??0;return a.durationSum=s-o+f,a.avgFps=R(t,i,a.durationSum),a.avgFpsString=m(a.avgFps),a.presentedAvgFps=a.avgFps,me(a),a}var Ce,we,Te,Ee,De,Oe,ke=t((()=>{Ce=.001,we=.005,Te=.15,Ee=Te/2,De=.5,Oe=(()=>{let e=[];for(let t of[24,30,48,60,120,240])e.push(h(t*1e3,1001));for(let t=1;t<=240;t++)e.push(h(t,1));return e})()}));let Ae=408125543,V=290298740,je=19899,Me=21419,Ne=21420,H=357149030,Pe=2807729,Fe=17545,U=374648427,Ie=29637,Le=2352003,Re=2306383,ze=22186,Be=25506,Ve=28032,He=2327523,Ue=475249515,W=307544935,We=29555,Ge=25536,Ke=25541,qe=26568,Je=17827,Ye=17543,Xe=423732329,Ze=24999,Qe=18016,$e=272869232,et=30114,tt=new Set([V,H,U,Ue,W,524531317,$e,Xe]);function G(e){return e===0?0:Math.clz32(e)-23}function nt(e,t){if(t>=e.length)return null;let n=G(e[t]);if(n<1||n>4||t+n>e.length)return null;let r=0;for(let i=0;i<n;i++)r=r*256+e[t+i];return{id:r,length:n}}function rt(e,t){if(t>=e.length)return null;let n=e[t],r=G(n);if(r<1||t+r>e.length)return null;let i=255>>r,a=(n&i)===i,o=n&i;for(let n=1;n<r;n++){let r=e[t+n];r!==255&&(a=!1),o=o*256+r}return a?{size:-1,length:r}:o>2**53-1?null:{size:o,length:r}}function K(e,t,n){let r=nt(e,t);if(!r)return null;let i=rt(e,t+r.length);return i?{id:r.id,pos:n+t,size:i.size,dataStart:n+t+r.length+i.length}:null}function it(e,t){if(t>=e.length)return!0;let n=G(e[t]);if(n<1||n>4)return!1;let r=t+n;return r>=e.length||e[r]!==0&&r+G(e[r])>e.length}function at(e,t,n){let r=t<n?G(e[t]):0;if(r<1||t+r>n)return null;let i=e[t]&255>>r;for(let n=1;n<r;n++)i=i*256+e[t+n];return{value:i,length:r}}function ot(e,t,n){let r=0;for(let i=0;i<n;i++)r=r*256+e[t+i];return r}function st(e,t,n){let r=0n;for(let i=0;i<n;i++)r=r<<8n|BigInt(e[t+i]);return r}function ct(e,t,n){if(n===0)return 0;let r=new DataView(e.buffer,e.byteOffset+t,n);return n===4?r.getFloat32(0):n===8?r.getFloat64(0):NaN}let lt=new TextDecoder;function q(e,t,n){let r=t;for(;r<t+n&&e[r]!==0;)r++;return lt.decode(e.subarray(t,r)).replace(/[^\x20-\x7e\xa0-\uffff]/g,`?`)}function*ut(e,t,n){let r=t,i=Math.min(n,e.length);for(;r<i;){let t=K(e,r,0);if(!t||t.size===-1||t.dataStart+t.size>i)return;yield{id:t.id,start:t.dataStart,size:t.size},r=t.dataStart+t.size}}function dt(e,t){return t.size>6?Number(st(e,t.start,t.size)):ot(e,t.start,t.size)}var ft=class{reader;size;window;buf=new Uint8Array;base=0;#e=[];constructor(e,t){this.reader=e,this.size=e.size,this.window=t;let n=e.peek(0,Math.min(e.size,e.headWindow));n&&n.byteLength>0&&this.#t({base:0,buf:new Uint8Array(n.buffer,n.byteOffset,n.byteLength)})}has(e,t){return e>=this.base&&Math.min(this.size,e+t)<=this.base+this.buf.length}cached(e,t){let n=Math.min(this.size,e+t);return this.#e.some(t=>e>=t.base&&n<=t.base+t.buf.length)||this.reader.peek(e,n-e)!==null}async load(e,t,n=this.window){if(this.has(e,t))return;let r=Math.min(this.size,e+t);for(let t of this.#e)if(e>=t.base&&r<=t.base+t.buf.length){this.#t(t);return}let i=Math.max(t,n),a=await this.reader.view(e,i,i);this.#t({base:e,buf:new Uint8Array(a.buffer,a.byteOffset,a.byteLength)})}chunkAt(e){return this.#e.find(t=>e>=t.base&&e<t.base+t.buf.length)??null}async header(e){return this.has(e,12)||await this.load(e,12),K(this.buf,e-this.base,this.base)}#t(e){this.buf=e.buf,this.base=e.base;let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1),this.#e.unshift(e),this.#e.length>4&&(this.#e.length=4)}};let pt=new Map([[V,[je]],[H,[Pe,Fe,19840,22337,29604,17505,31657,29572,3979555,3965867,4110627,4096955,17476,26916]],[U,[174]],[Ue,[187]],[W,[We]],[$e,[17849]],[Xe,[Ze]]]),mt=new Uint8Array(256);for(let e of tt)mt[e>>>24]=1;let ht=new Uint8Array(256);ht[31]=1;function gt(e,t,n){if(e[t]!==31||e[t+1]!==67||e[t+2]!==182||e[t+3]!==117)return!1;let r=rt(e,t+4);if(!r)return!1;let i=t+4+r.length,a=r.size===-1?e.length:Math.min(e.length,i+r.size);if(r.size!==-1&&i+r.size>n)return!1;for(let t=0;t<4&&i<a;t++){let t=nt(e,i);if(!t)return!1;let n=rt(e,i+t.length);if(!n||n.size===-1)return!1;if(t.id===231)return n.size<=8;if(t.id!==191&&t.id!==236&&t.id!==167&&t.id!==171)return!1;i+=t.length+n.length+n.size}return!1}function _t(e,t,n,r){let i=nt(e,t);if(i?.length!==4)return!1;if(i.id===524531317)return gt(e,t,n);let a=pt.get(i.id),o=rt(e,t+4);if(!a||!o||o.size<2)return!1;let s=t+4+o.length+o.size,c=s<=r?K(e,t+4+o.length,0):null;return!!c&&c.size!==-1&&c.dataStart+c.size<=s&&(a.includes(c.id)||c.id===236||c.id===191)}async function vt(e,t,n,r,i={}){let a=i.clustersOnly?ht:mt,o=i.step??Math.max(e.window,65536),s=Math.max(0,t),c=Math.min(n,e.size);for(;s<c;){let t=e.chunkAt(s);if(!t||t.base+t.buf.length<e.size&&t.base+t.buf.length-s<128){if(i.canLoad&&!i.canLoad())return-1;let n=Math.min(o,c-s+64);await e.load(s,Math.min(n,e.size-s),n),t={base:e.base,buf:e.buf}}let n=t.buf,l=t.base,u=Math.min(l+n.length>=e.size?n.length:n.length-64,c-l);if(u<=s-l)break;for(let e=s-l;e<u;e++)if(a[n[e]]&&r(n,e,l))return l+e;s=l+u}return-1}function yt(e,t,n,r,i={}){return vt(e,t,n,(e,t,n)=>gt(e,t,r-n),{...i,clustersOnly:!0})}function bt(e,t,n,r,i={}){let a=e.size;return vt(e,t,n,(e,t,n)=>_t(e,t,r-n,a-n),i)}let xt=new Map([[V,`SeekHead`],[H,`Info`],[W,`Tags`]]),St=new Set([V,H,U,W,Xe]),Ct=new Map([[V,[je]],[je,[Me,Ne]],[H,[Pe,Fe]],[U,[174]],[174,[215,Ie,131,134,Be,Ve,Le,Re,ze,224]],[224,[176,186,He]],[W,[We]],[We,[Ge,qe]],[Ge,[Ke]],[qe,[Je,Ye,qe]],[Xe,[Ze]],[Ze,[Qe]],[Ue,[187]],[187,[183]],[183,[241]]]),wt=e=>e.toString(16).toUpperCase();function J(e,t=0){return e.reader.reads<5&&e.reader.bytesFetched+Math.max(t,e.window)<=1048576}function Tt(e){let t=/^\s*(\d+):(\d{1,2}):(\d{1,2}(?:\.\d+)?)\s*$/.exec(e);return t?Number(t[1])*3600+Number(t[2])*60+Number(t[3]):null}function Et(){return{number:0,uid:0n,type:0,codecId:``,defaultDuration:0,frameRate:0,trackTimestampScale:1,codecDelay:0,codecPrivate:null,encoded:!1,width:0,height:0}}function Dt(e,t){t.trackTimestampScale>=.01||(t.trackTimestampScale=1),!t.defaultDuration&&t.frameRate>0&&(t.defaultDuration=Math.trunc(1e9/t.frameRate)),Number.isSafeInteger(t.defaultDuration)||(t.defaultDuration=0),e.tracks.push(t)}function Ot(e,t,n,r,i,a=null,o=null){let s=o??Et(),c=-1,l=-1,u=[],d=[],f=``,p=``,m=!1,h=(n,r,i,o)=>{let g=Ct.get(n)??[];if(o>16)m=!0;else for(let m of ut(t,r,i)){if(!g.includes(m.id))continue;let r=m.start,i=m.size,_=()=>dt(t,m),v=()=>h(m.id,r,r+i,o+1);switch(m.id){case 174:s=Et(),v(),Dt(e,s);break;case We:u=[],d=[],v();for(let t of d)for(let n of u.length?u:[0n])e.tagDurations.has(n)||e.tagDurations.set(n,t);break;case qe:{let e=[f,p];f=p=``,v();let t=n===29555&&(f===`DURATION`||f.startsWith(`DURATION-`))?Tt(p):null;t!==null&&d.push(t),[f,p]=e;break}case je:c=l=-1,v(),c>=0&&l>=0&&!e.seek.has(c)&&e.seek.set(c,e.segmentData+l);break;case 215:s.number=_();break;case Ie:s.uid=st(t,r,i);break;case 131:s.type=_();break;case 134:s.codecId=q(t,r,i);break;case Le:s.defaultDuration=_();break;case Re:s.trackTimestampScale=ct(t,r,i);break;case ze:s.codecDelay=_();break;case Ve:s.encoded=!0;break;case Be:s.codecPrivate=t.slice(r,r+Math.min(i,4096));break;case 176:s.width=_();break;case 186:s.height=_();break;case He:s.frameRate=ct(t,r,i);break;case Pe:_()>0&&(e.timestampScale=_());break;case Fe:{let n=ct(t,r,i);i!==0&&i!==4&&i!==8?e.warnings.push(`Duration has an invalid size of ${i} bytes`):Number.isFinite(n)?e.duration=n:e.warnings.push(`invalid Duration value ${n}`);break}case Me:c=i<=4?_():-1;break;case Ne:l=_();break;case Ke:u.push(st(t,r,i));break;case Je:f=q(t,r,i).toUpperCase();break;case Ye:p=q(t,r,i);break;case Qe:q(t,r,i).startsWith(`image/`)&&e.attachedImages++;break;case 241:a?.push(e.segmentData+_());break;default:v()}}};h(i,n,r,2),m&&e.warnings.push(`elements nested deeper than 16 levels ignored`)}async function kt(e,t){return e.cached(t,12)||J(e)?e.header(t):null}async function At(e,t,n){let r=Math.min(n.dataStart+n.size,e.size),i=n.dataStart;for(;i<r;){let n=await kt(e,i);if(!n||n.size===-1)break;let a=Math.min(n.dataStart+n.size,r);if(n.id===174){let r=Et();for(let i=n.dataStart;i<a;){let n=await kt(e,i);if(!n||n.size===-1)break;let o=n.dataStart+n.size-n.pos;n.size<=65536&&n.pos+o<=a&&(e.cached(n.pos,o)||J(e,o))&&(await e.load(n.pos,o),Ot(t,e.buf,n.pos-e.base,n.pos-e.base+o,174,null,r)),i=n.pos+o}Dt(t,r)}i=n.dataStart+n.size}i<r&&t.warnings.push(`Tracks at ${n.pos} only partly read (header budget)`)}async function jt(e,t,n,r){if(r.at.add(n.pos),n.id===475249515&&(t.cuesPos??=n.pos),!St.has(n.id))return;let i=Math.max(0,Math.min(n.size,e.size-n.dataStart)),a=Math.min(i,1048576),o=e.cached(n.dataStart,a);if(n.id===374648427&&a<i&&!o){r.ids.add(n.id),await At(e,t,n);return}if(!o&&(!J(e,a)||n.id===423732329)){n.id===374648427?(r.ids.add(n.id),await At(e,t,n)):n.id!==423732329&&t.warnings.push(`${xt.get(n.id)??wt(n.id)} element at byte ${n.pos} not read (header budget)`);return}r.ids.add(n.id),await e.load(n.dataStart,a);let s=n.dataStart-e.base;Ot(t,e.buf,s,s+a,n.id)}function Mt(e,t,n){e.segmentUnknownSize||e.segmentExtended||(e.segmentExtended=!0,e.segmentEnd=t.size,e.declaredEnd=Math.max(e.declaredEnd,t.size),e.warnings.push(`${n}: the Segment size is wrong, reading to the end of the file like ffprobe`))}async function Nt(e,t,n){let r=n;for(let n=0;n<16&&r<e.size;n++){if(!e.cached(r,12)&&!J(e))return t.warnings.push(`Segment search stopped at ${r} (header budget)`),null;let n=await e.header(r),i=e.buf,a=r-e.base;if(i[a]===24&&i[a+1]===83&&i[a+2]===128&&i[a+3]===103)return n||(t.warnings.push(`corrupt Segment size at ${r}`),t.segmentExtended=!0,{id:Ae,pos:r,size:-1,dataStart:r+4+(G(i[a+4])||8)});if(!n||n.size===-1)return null;r=n.dataStart+n.size}return null}async function Pt(e){let t={docType:`matroska`,segmentData:0,segmentEnd:0,declaredEnd:0,segmentUnknownSize:!1,segmentExtended:!1,timestampScale:1e6,duration:0,tracks:[],tagDurations:new Map,firstCluster:null,walkEnd:0,cuesPos:null,seek:new Map,attachedImages:0,warnings:[]},n=await e.header(0);if(!n||n.id!==440786851||n.size===-1||n.dataStart+n.size>e.size)throw Error(`invalid EBML header`);await e.load(n.dataStart,Math.min(n.size,4096));let r=n.dataStart-e.base;for(let i of ut(e.buf,r,r+n.size))i.id===17026&&(t.docType=q(e.buf,i.start,i.size));let i=()=>J(e),a=await Nt(e,t,n.dataStart+n.size);if(!a){let r=await bt(e,n.dataStart+n.size,e.size,e.size,{canLoad:i});if(r<0)throw Error(`no Segment element`);t.warnings.push(`no valid Segment header: reading level-1 elements from ${r}`),t.segmentExtended=!0,a={id:Ae,pos:r,size:-1,dataStart:r}}t.segmentData=a.dataStart,t.segmentUnknownSize=a.size===-1&&!t.segmentExtended,t.declaredEnd=a.size===-1?2**53-1:a.dataStart+a.size,t.segmentEnd=Math.min(e.size,t.declaredEnd),t.declaredEnd>e.size&&a.size!==-1&&t.warnings.push(`truncated file: Segment ends ${t.declaredEnd-e.size} bytes after EOF`);let o={ids:new Set,at:new Set},s=t.segmentData,c=s,l=-1;for(;!(s>=t.segmentEnd&&(s>=e.size||(Mt(t,e,`Segment ends at ${s} before any Cluster`),s>=t.segmentEnd)));){if(!e.cached(s,12)&&!i()){t.warnings.push(`header walk stopped at ${s} (header budget)`),l=s;break}let n=await e.header(s);if(n?.id===524531317){t.firstCluster=s;break}let r=`invalid data at ${s} before the first Cluster`;if(n&&n.size!==-1&&(tt.has(n.id)||n.id===236||n.id===191)){let i=n.dataStart+n.size;if(i>t.segmentEnd&&i<=e.size&&Mt(t,e,`${wt(n.id)} at ${s} ends after the Segment`),await jt(e,t,n,o),c=s+1,i<=e.size){s=i;continue}r=`${wt(n.id)} at ${s} ends after the end of the file`}let a=await bt(e,c,e.size,Math.max(t.declaredEnd,e.size),{canLoad:i});if(t.warnings.push(a<0?r:`${r}: resynchronised at ${a}`),a<0)break;a>=t.segmentEnd&&Mt(t,e,`level-1 element at ${a} after the Segment end`),c=a+1,s=a}t.walkEnd=t.firstCluster??(l>=0?l:c);for(let n of[V,H,U,W]){let r=t.seek.get(n);if(r===void 0||o.at.has(r)||n!==290298740&&o.ids.has(n)||r>=t.segmentEnd)continue;let i=await kt(e,r);i?.id===n?await jt(e,t,i,o):t.warnings.push(`SeekHead entry ${wt(n)} not followed`)}if(t.cuesPos??=t.seek.get(475249515)??null,o.ids.has(357149030)||t.warnings.push(`no Info element: TimestampScale 1000000 assumed`),!t.tracks.length)throw Error(o.ids.has(374648427)?`no complete TrackEntry in Tracks`:`no Tracks element found`);return t}let Ft=2147483647n,It=new Set([231,163,160,167,171,236,191]),Lt=new Set([161,155,251,et,30113,164,236,191]),Rt=new Set([231,155,251,et]);function Y(e,t,n,r=1/0){let i=new Map;for(let t of n){let n=Math.trunc(e.timestampScale*t.trackTimestampScale)||e.timestampScale;i.set(t.number,{track:t,tickNs:n,codecDelayTicks:Math.round(t.codecDelay/n),pts:new Float64Array(256),n:0,blocks:0,frames:0,invisible:0,missingPts:0,noPtsFrames:0,nextPts:NaN,pending:[],overLimit:0,maxPts:-1/0,maxPtsDur:0})}return{header:e,tracks:i,known:new Set(e.tracks.map(e=>e.number)),fileSize:t,maxSamples:r,clusters:0,truncated:!1,missingClusterTs:0,maxAnyTicks:-1/0,lastGood:-1,resyncs:0,afterSegment:-1,switchReads:1/0,largeWindow:0,warnings:[]}}function zt(e,t,n){if(e.n===e.pts.length){let t=new Float64Array(Math.max(e.n+1,Math.min(e.pts.length*2,n)));t.set(e.pts),e.pts=t}e.pts[e.n++]=t}function Bt(e,t,n){let r=Math.min(e.length,t+n),i=at(e,t,r);if(!i)return null;let a=t+i.length;if(a+3>r)return null;let o=e[a]<<24>>16|e[a+1],s=e[a+2],c=1;if(s&6){if(a+4>r)return null;c=e[a+3]+1}return{track:i.value,rel:o,flags:s,laces:c}}function Vt(e,t,n,r){if(t>=n)return`invalid`;if(t>=r)return`more`;let i=G(e[t]);if(!i||t+i>n)return`invalid`;if(t+i>r)return`more`;let a=BigInt(e[t]&255>>i);for(let n=1;n<i;n++)a=a*256n+BigInt(e[t+n]);return{v:a,n:i}}function Ht(e,t,n,r){let i=t+n,a=Math.min(i,e.length),o=Bt(e,t,a-t);if(!o){let n=t<a?G(e[t]):0;return a<i&&(t>=a||n>0&&t+n+4>a)?`more`:`invalid`}let s=t+G(e[t]);if(r&&!r.has(o.track))return`invalid`;let c=o.flags>>1&3;if(!c)return o;let l=i-s-4;if(l<0)return`invalid`;let u=o.laces,d=s+4;if(c===2)return l%u?`invalid`:o;if(c===1){let t=0;for(let n=0;n<u-1;n++){let n;do{if(l<=t)return`invalid`;if(d>=a)return`more`;n=e[d++],t+=n,l--}while(n===255)}return l<t?`invalid`:o}let f=Vt(e,d,i,a);if(typeof f==`string`)return f;if(f.v>Ft)return`invalid`;let p=f.v,m=f.v;d+=f.n;for(let t=1;t<u-1;t++){if(f=Vt(e,d,i,a),typeof f==`string`)return f;let t=p+f.v-((1n<<BigInt(7*f.n-1))-1n);if(t<0n||t>Ft)return`invalid`;p=t,m+=t,d+=f.n}return BigInt(i-d)<m?`invalid`:o}function Ut(e,t,n,r){t.n<e.maxSamples?zt(t,n,e.maxSamples):t.overLimit++,n>=t.maxPts&&(t.maxPts=n,t.maxPtsDur=r),t.nextPts=n+r}function Wt(e,t,n,r){let i=n+t.rel;i>e.maxAnyTicks&&(e.maxAnyTicks=i);let a=e.tracks.get(t.track);if(!a)return null;let o=t.laces;a.blocks++,a.frames+=o,t.flags&8&&a.invisible++;let s=r>0?r:Math.floor(a.track.defaultDuration*o/e.header.timestampScale),c=e=>Math.floor(s*e/o);if(i<0){a.noPtsFrames+=o;for(let t=0;t<o;t++)Number.isNaN(a.nextPts)?a.pending.push(c(t+1)-c(t)):Ut(e,a,a.nextPts,c(t+1)-c(t));return a}let l=a.track.trackTimestampScale,u=(l===1?n:Math.floor(n/l))+t.rel-a.codecDelayTicks,d=u;for(let e of a.pending)d-=e;for(let t of a.pending.splice(0))Ut(e,a,d,t),d+=t;for(let t=0;t<o;t++){if(t>0&&s===0){a.missingPts+=o-t;break}Ut(e,a,u+c(t),c(t+1)-c(t))}return a}async function Gt(e,t,n){let r=Math.min(n.size,16);for(;;){e.has(n.dataStart,r)||await e.load(n.dataStart,r);let i=Ht(e.buf,n.dataStart-e.base,n.size,t.known);if(i!==`more`)return i;if(r>=n.size)return`invalid`;r=Math.min(n.size,r*8)}}function Kt(e,t){return e.has(t,12)?K(e.buf,t-e.base,e.base):void 0}async function qt(e,t){return(Kt(e,t)??await e.header(t))||(it(e.buf,t-e.base)?`eof`:`invalid`)}function Jt(e,t){return e.has(t.dataStart,t.size)?ot(e.buf,t.dataStart-e.base,t.size):void 0}async function Yt(e,t){return await e.load(t.dataStart,t.size),ot(e.buf,t.dataStart-e.base,t.size)}function Xt(e,t){return e.size===-1||e.dataStart+e.size>t||Rt.has(e.id)&&e.size>8||(e.id===163||e.id===161)&&e.size>268435456?`invalid`:null}async function Zt(e,t,n,r=1/0){let i=Kt(e,n)??await e.header(n);if(!i||i.id!==524531317)return null;let a=t.fileSize,o=i.size===-1?1/0:i.dataStart+i.size;t.clusters++;let s=-1,c=0,l=i.dataStart,u=e=>({next:l,videoBlocks:c,error:e});for(;l<o;){if(c>=r||t.stop)return{next:Math.min(o,l),videoBlocks:c,error:null};if(t.switchReads<=e.reader.reads&&(e.window=t.largeWindow,t.switchReads=1/0),l>=a)return o===1/0?{next:l,videoBlocks:c,error:null}:u(`eof`);let n=Kt(e,l);if(n||=await qt(e,l),typeof n==`string`)return u(n);let i=It.has(n.id);if(!i&&o===1/0&&(tt.has(n.id)||n.id===408125543))return{next:l,videoBlocks:c,error:null};let d=Xt(n,o);if(d)return u(d);i&&(t.lastGood=l);let f=n.dataStart+n.size;if(f>a)return u(`eof`);if(n.id===231)s=Jt(e,n)??await Yt(e,n);else if(n.id===163||n.id===160){let r=n,i=0;if(n.id===160){r=null;for(let a=n.dataStart;a<f;){let n=Kt(e,a)||await qt(e,a),o=typeof n==`string`?n:Xt(n,f);if(o||typeof n==`string`)return l=a,u(o??`invalid`);Lt.has(n.id)&&(t.lastGood=a),n.id===161?r=n:n.id===155&&(i=Jt(e,n)??await Yt(e,n)),a=n.dataStart+n.size}}if(r){let n=e.has(r.dataStart,Math.min(r.size,16))?Ht(e.buf,r.dataStart-e.base,r.size,t.known):`more`;if(n===`more`&&(n=await Gt(e,t,r)),n===`invalid`)return u(`invalid`);s<0&&(t.missingClusterTs++,s=0);let a=Wt(t,n,s,i);t.onBlock?.(n,s,i,r),a&&a.track.type===1&&c++}}l=f}return{next:o,videoBlocks:c,error:null}}function Qt(e,t,n,r){n<0&&r===`eof`?e.truncated=!0:++e.resyncs>5||(n<0?e.warnings.push(`invalid data at ${t}, no further level-1 element`):n>=t?e.warnings.push(`skipped ${n-t} bytes of invalid data at ${t}`):e.warnings.push(`invalid data at ${t}: resynchronised at ${n}`))}async function $t(e,t,n,r){let i=t.header,a=t.fileSize,o=i.segmentUnknownSize||i.segmentExtended?1/0:i.declaredEnd,s=n;for(t.lastGood=n-1;!t.stop;){e.reader.checkAbort(),r?.(s,Math.min(a,o));let n=null,i=s;if(s>=a){s<o&&o!==1/0&&(t.truncated=!0);break}if(s>=o){o=1/0;let n=await bt(e,Math.max(t.lastGood+1,s),a,1/0);if(n<0)break;t.afterSegment<0&&(t.afterSegment=s),s=n;continue}let c=await qt(e,s);if(typeof c==`string`)n=c;else{let r=tt.has(c.id)||c.id===236||c.id===191;if(c.id===408125543&&o===1/0?(t.afterSegment<0&&(t.afterSegment=s),n=`invalid`):c.size===-1?c.id===524531317?o=1/0:n=`invalid`:c.dataStart+c.size>o&&(n=`invalid`),!n){if(r&&(t.lastGood=s),c.id===524531317){let r=await Zt(e,t,s);r.error?(n=r.error,i=r.next):s=r.next}else c.dataStart+c.size>a?n=`eof`:s=c.dataStart+c.size}}if(!n)continue;o=1/0;let l=await bt(e,t.lastGood+1,a,1/0);if((n!==`invalid`||i!==t.afterSegment)&&Qt(t,i,l,n),l<0)break;s=l}t.resyncs>5&&t.warnings.push(`${t.resyncs-5} more resynchronisation(s) after invalid data`),t.afterSegment>=0&&t.warnings.push(`data after the Segment end at ${t.afterSegment} was scanned like ffprobe does (concatenated files?)`)}async function en(e,t,n,r){await e.load(t,n-t,n-t);let i=e.buf,a=e.base,o=[];for(let e=n-a-4;e>=t-a;e--)i[e]===31&&gt(i,e,r-a)&&o.push(a+e);return o}var tn=n({attachEstimate:()=>pn,av1TimingInfo:()=>un,h264Sps:()=>sn,setupUnsupported:()=>fn});function nn(e){let t=Math.floor(e),n=e-t;return n>.5||n===.5&&t%2!=0?t+1:t}function rn(e,t){for(;t;)[e,t]=[t,e%t];return e}function an(e,t){let n=e>>3,r=n<12?[480,960,1920,2880][n&3]:n<16?[480,960][n&1]:[120,240,480,960][n&3],i=e&3,a=i===0?1:i<3?2:t&63;return a>0&&r*a<=5760?r*a:0}function on(e){let t=[];for(let n=1,r=0;n<e.length;n++)r>=2&&e[n]===3?r=0:(t.push(e[n]),r=e[n]?0:r+1);let n=0,r=e=>{let r=0;for(let i=n+e;n<i;n++){if(n>>3>=t.length)throw RangeError();r=r*2+(t[n>>3]>>7-(n&7)&1)}return r};return{u:r,ue:()=>{let e=0;for(;!r(1);)if(++e>31)throw RangeError();return 2**e-1+r(e)}}}function sn(e){let{u:t,ue:n}=on(e);try{let e=t(8);if(e!==66)return`H.264 profile ${e}`;t(16),n();let r={frameNumBits:n()+4,pocType:n(),pocLsbBits:0,fixedDelay:!1};if(r.pocType===0&&(r.pocLsbBits=n()+4),r.pocType===1){t(1),n(),n();for(let e=n();e>0;e--)n()}if(r.frameNumBits>16||r.pocLsbBits>16||r.pocType>2)return`bad H.264 SPS`;n(),t(1),n(),n();let i=t(1)||(t(1),0);if(t(1),t(1))for(let e=0;e<4;e++)n();if(t(1)){if(t(1)&&t(8)===255&&t(32),t(1)&&t(1),t(1)&&(t(4),t(1))&&t(24),t(1)&&(n(),n()),t(1))return`H.264 timing info`;if(t(1)||t(1)||t(1))return`H.264 HRD or pic_struct`;if(t(1)){t(1);for(let e=0;e<4;e++)n();if(n())return`H.264 reordering`;r.fixedDelay=!0}}return r.pocType===1?`H.264 pic_order_cnt_type 1`:i?r:`H.264 field coding`}catch{return`bad H.264 SPS`}}function cn(e,t){let n=[];if(t)for(let r=0;r+t<=e.length;){let i=0;for(let n=r+t;r<n;r++)i=i*256+e[r];n.push(e.subarray(r,r+=i))}else for(let t=0,r=-1;t<=e.length;t++)t<e.length&&(e[t]||e[t+1]||e[t+2]!==1)||(r>=0&&n.push(e.subarray(r,t)),r=t+3,t+=2);return n}function ln(e,t){let n=e?(e[4]&3)+1:0,r=e?[]:cn(t[0],0);if(e){let t=5;for(let n of[31,255])for(let i=e[t++]&n,a=0;i-->0&&t+2<=e.length;t+=2+a)a=e[t]<<8|e[t+1],r.push(e.subarray(t+2,t+2+a))}let i=e=>e[0]&31,a=r.find(e=>i(e)===7),o=a?sn(a):`no H.264 SPS`;if(typeof o==`string`)return o;let s=[];for(let e of t){let t=cn(e,n).find(e=>i(e)===1||i(e)===5);if(!t)return`no H.264 slice header`;s.push(t)}if(i(s[0])!==5)return`H.264 does not start with an IDR`;let c=r.filter(e=>i(e)===8);if(!c.length)return`no H.264 PPS`;let l=2**o.frameNumBits,u=0,d=NaN,f=-1,p=0,m=null;try{for(let e of c){let{u:t,ue:n}=on(e);if(n(),n(),t(1),t(1)&&!o.pocType)return`H.264 bottom field POC`}for(let e of s){let{u:t,ue:n}=on(e);n(),n(),n();let r=t(o.frameNumBits);if(i(e)===5)n(),u=p=0,d=NaN,m=null;else if(f>=0&&r!==f&&r!==(f+1)%l)return`H.264 frame_num gap`;else r<f&&(p+=l);f=r;let a=2*(p+r)-(e[0]&96?0:1);if(!o.pocType){let n=t(o.pocLsbBits),r=2**o.pocLsbBits;d>=0||(d=n);let i=n<d&&d-n>=r/2?u+r:n>d&&n-d>r/2?u-r:u;a=i+n,e[0]&96&&([u,d]=[i,n])}if(m!==null&&(o.fixedDelay?a<m:a-m!==1&&a-m!==2))return`H.264 POC step ${a-m}`;m=a}}catch{return`bad H.264 PPS or slice header`}return null}function un(e){for(let t=0;t<e.length;){let n=e[t],r=t+1+(n>>2&1),i=e.length-r;if(n&2)for(let t=0,n=128;n&128;t+=7)i=(t?i:0)+((n=e[r++]??0)&127)*2**t;if((n>>3&15)==1)return r<e.length?(e[r]&12)==4:null;t=r+i}return null}function dn(e,t){let n=e.codecPrivate;if(e.codecId===yn){let e=un(n&&n.length>4?n.subarray(4):t[0]);return e===null?`no AV1 sequence header`:e?`AV1 timing info`:null}return e.codecId===vn?ln(n,t):null}function fn(e){let t=e.tracks.filter(e=>e.type===1);if(t.length!==1)return`${t.length} video tracks`;if(new Set(e.tracks.map(e=>e.number)).size<e.tracks.length)return`duplicate track numbers`;if(e.attachedImages)return`attached pictures`;if(![`V_VP8`,`V_VP9`,yn,vn].includes(t[0].codecId))return`codec ${t[0].codecId}`;for(let t of e.tracks){if(t.trackTimestampScale!==1||t.encoded)return`track ${t.number} scale or encoding`;let e=t.codecPrivate;if(t.type!==1&&(t.codecId!==`A_OPUS`||!e||String.fromCharCode(...e.subarray(0,8))!==`OpusHead`||e[18]!==0))return`track ${t.number} (${t.codecId||t.type})`}return null}function pn(e,t,n,r,i=!1){let a=fn(t);if(a)return a;let o=new Map;for(let e of t.tracks){let n=f(Math.trunc(t.timestampScale*e.trackTimestampScale),1e9,v);o.set(e.number,{tb:n,nb:0,cid:0,durs:0,seen:!1,first:null,firstIdx:0,last:null,lastIdx:0})}let s=t.tracks.find(e=>e.type===1),c=o.get(s.number),l=c.tb,u=l.num/l.den,d=s.codecId===vn,p=d||l.den>=101*l.num||l.den<5*l.num,m=p?u>5e-4?40:20:0,h=new Float64Array(4*X),g=(e,t)=>{let n=h[2*e*X+t]/y;return h[(2*e+1)*X+t]/y-n*n},_=null,y=0,b=0,x=0,S=0,C=null,w=null,T=null,E=()=>r.resyncs||r.truncated||r.missingClusterTs,D=[],O=n.newScanState(t,e.size,t.tracks),k=(r,i,a,s)=>{let f=n.addBlock(O,r,i,a);if(S>=mn||c.nb&&y>=m&&[...o.values()].every(e=>e.seen||e.nb>=hn))return!1;let p=o.get(f.track.number),v=s.dataStart+Math.clz32(e.buf[s.dataStart-e.base])-20,w=s.dataStart+s.size-v,T=p===c,E=a||Math.floor(f.track.defaultDuration*r.laces/t.timestampScale);if(r.laces>1||f.noPtsFrames?C=`laced or untimed blocks`:!E&&!T?(E=Math.floor(an(e.buf[v-e.base],w>1?e.buf[v+1-e.base]:0)*p.tb.den/(48e3*p.tb.num)),(!E||w<1)&&(C=`a bad Opus packet`)):!E&&l.num*1e3>l.den&&(E=1),T&&!c.nb&&s.id===163&&!(r.flags&128)&&(C=`no keyframe first`),C)return!1;S+=w;let k=T&&d&&c.nb<gn?null:f.pts[f.n-1];if(k!==null&&p.nb>1&&(p.last!==null&&(p.last>=k||p.first!==null&&p.lastIdx>p.firstIdx&&Math.floor((k-p.last)/1e3)>Math.floor((p.last-p.first)/(p.lastIdx-p.firstIdx)))&&(p.first=null),p.first===null&&(p.first=k,p.firstIdx=p.nb),p.last=k,p.lastIdx=p.nb),p.nb>1){let e=xn(p.cid,p.tb);if(!e&&p.nb>30&&p.first!==null&&p.last!==null&&(e=xn(p.last-p.first,p.tb)),e>=mn)return!1;E>0&&(p.cid+=E,p.durs++)}if(T&&k!==null&&_!==null&&k>_){let e=k*u;for(let t=0;t<X;t++){if(!(h[X+t]<1e10))continue;let n=e*bn(t)/12012;for(let e=0;e<2;e++){let r=n-nn(n+e*.5)+e*.5;h[2*e*X+t]+=r,h[(2*e+1)*X+t]+=r*r}}if(y++,b+=k-_,y%10==0)for(let e=0;e<X;e++)h[X+e]<1e10&&g(0,e)>.04&&g(1,e)>.04&&(h[X+e]=h[3*X+e]=2e10);y>3&&(x=rn(x,k-_))}if(T&&k!==null&&(_=k),k!==null&&(p.seen=!0),T&&c.nb<(d?gn:1)){let t=Math.min(w,_n);D.push(e.has(v,t)?e.buf.slice(v-e.base,v+t-e.base):[v,t])}return p.nb++,!0};return r.onBlock=(e,t,n,a)=>{if(T===null){try{if(k(e,t,n,a))return}catch(e){w=[e]}T=E(),i&&(r.stop=!0)}},async()=>{if(w)throw w[0];if(C)return C;if(!c.nb||(T??E()))return`damaged first Clusters`;let t=[];for(let n of D)t.push(n instanceof Uint8Array?n:(await e.load(n[0],n[1],n[1]),e.buf.slice(n[0]-e.base,n[0]+n[1]-e.base)));let n=dn(s,t);if(n)return n;let r=null,i=null;if(p&&y>15&&x>Math.max(1,Math.floor(l.den/(500*l.num)))&&(r=f(l.den,BigInt(l.num)*BigInt(x),v)),y>1&&!r&&p){let e=0,t=.01;for(let n=0;n<X;n++){let r=bn(n);if(!((c.cid?c.cid*u<11511.5/r:r<12012)||u*b/y<9609.6/r))for(let i=0;i<2;i++){let a=g(i,n);a<t&&t>1e-9&&(t=a,e=r)}}e&&e/12012<1.01*(l.den/l.num)&&(r=f(e,12012,v))}if(r&&b&&c.cid<=0&&y>2&&Math.abs(1/(r.num/r.den*u)-b/y)<=1&&(i=r),c.durs&&!i&&c.cid){i=f(BigInt(c.durs)*BigInt(l.den),BigInt(c.cid)*BigInt(l.num),6e4);let e=.01,t=0;for(let n=0;n<X;n++){let r=Math.abs(i.num/i.den/(bn(n)/12012)-1);r<e&&(e=r,t=bn(n))}t&&(i=f(t,12012,v))}return r??={num:l.den,den:l.num},{avg:i?`${i.num}/${i.den}`:`0/0`,r:`${r.num}/${r.den}`,packets:c.nb}}}var X,mn,hn,gn,_n,vn,yn,bn,xn,Sn=t((()=>{y(),X=399,mn=5e6,hn=50,gn=7,_n=1024,vn=`V_MPEG4/ISO/AVC`,yn=`V_AV1`,bn=e=>e<360?(e+1)*1001:e<390?(e-329)*12012:e<393?[80,120,240][e-390]*12012:[24,30,60,12,15,48][e-393]*12e3,xn=(e,t)=>Number((BigInt(e)*BigInt(t.num)*1000000n+BigInt(t.den>>1))/BigInt(t.den))}));c(),y(),ke();let Z=4096,Cn=262144,wn=5e6,Tn=new Set([231,236,191,167,171]);s.perBlockMs;let En=`no DefaultDuration: avg_frame_rate and r_frame_rate `,Dn=`${En}come from the first packets, which header mode does not read`;function On(e){for(let t of`V_AV1:av1 V_VP8:vp8 V_VP9:vp9 V_MPEG4/ISO/AVC:h264 V_MPEGH/ISO/HEVC:hevc V_MPEGI/ISO/VVC:vvc V_MPEG4/ISO/ASP:mpeg4 V_MPEG4/ISO/AP:mpeg4 V_MPEG4/ISO/SP:mpeg4 V_MPEG4/MS/V3:msmpeg4v3 V_MPEG1:mpeg1video V_MPEG2:mpeg2video V_PRORES:prores V_MJPEG:mjpeg V_FFV1:ffv1 V_THEORA:theora V_UNCOMPRESSED:rawvideo V_DIRAC:dirac`.split(` `)){let[n,r]=t.split(`:`);if(e.startsWith(n))return r}return``}function kn(e){if(!(e>0))return null;let t=g(1e9,e,3e4),n=m(t);return{avg:n,r:t.num<t.den*1e3&&t.num>t.den*5?n:null}}function An(e,t){let n=new Map,r={minFps:null,maxFps:null,isVfr:null,vfrRatio:0,distinctDeltas:0,duplicateTimestamps:0,timestampsQuantized:!1,medianDelta:null},i=0;for(let e of t){r.duplicateTimestamps+=e.duplicateTimestamps;for(let[t,r]of e.histogram)n.set(t,(n.get(t)??0)+r),i+=r}let a=[...n.keys()].sort((e,t)=>e-t);if(r.distinctDeltas=a.length,i===0)return r;let o=0,s=a.find(e=>(o+=n.get(e)??0)*2>=i)??a[0],c=ne(s,e,a),l=0;for(let e of a)Math.abs(e-s)>c&&(l+=n.get(e)??0);return r.medianDelta=s,r.minFps=N(e,a[a.length-1]),r.maxFps=N(e,a[0]),r.isVfr=i>=2&&l>0,r.vfrRatio=l/i,r.timestampsQuantized=!r.isVfr&&a.length>1,r}function jn(e,t,n){e.minFps=t.minFps,e.maxFps=t.maxFps,e.isVfr=t.isVfr,e.vfrRatio=t.vfrRatio,e.distinctDeltas=t.distinctDeltas,e.duplicateTimestamps=t.duplicateTimestamps,e.timestampsQuantized=t.timestampsQuantized;for(let t of[`minFps`,`maxFps`,`isVfr`,`duplicateTimestamps`])e.provenance[t]=n}function Mn(e,t){let n=x(t.number);n.fourccOrCodecId=t.codecId,n.codecName=On(t.codecId),n.width=t.width,n.height=t.height,n.timescale=1e9/(Math.trunc(e.timestampScale*t.trackTimestampScale)||e.timestampScale),n.provenance.codec=n.provenance.dimensions=`header`;let r=kn(t.defaultDuration);r?(n.avgFpsFfprobe=r.avg,n.rFpsFfprobe=r.r,n.nominalFps={...g(1e9,t.defaultDuration,3e4),kind:`declared`},n.provenance.nominalFps=`header`,t.frameRate>0&&t.defaultDuration===Math.trunc(1e9/t.frameRate)&&n.warnings.push(`DefaultDuration derived from Video FrameRate ${t.frameRate}`)):n.warnings.push(Dn);let i=e.tagDurations.get(t.uid);return i!==void 0&&(n.durationSec=i,n.provenance.durationSec=`header`),n}function Nn(e){return e.duration*e.timestampScale/1e9}function Pn(e,t,n){let r=n.durationSec??Nn(e);r>0&&t.defaultDuration>0&&n.warnings.push(`about ${Math.round(r*1e9/t.defaultDuration)} frames (estimated from duration x DefaultDuration, assumes CFR)`)}function Fn(e,t,n){let r=Nn(e),i=t*e.timestampScale/1e9;r>0&&Number.isFinite(i)&&r-i>Math.max(.5,.02*r)&&n.push(`Info Duration ${r.toFixed(3)} s exceeds the last block at ${i.toFixed(3)} s (false Duration or truncated file)`)}function In(e,t,n){e.provenance.durationSec===`header`&&e.durationSec!==null&&Math.abs(e.durationSec-t)>Math.max(2/e.timescale,1/(e.nominalFps?.value||1/0))&&e.warnings.push(`DURATION tag ${e.durationSec.toFixed(3)} s differs from the scanned ${t.toFixed(3)} s`),e.durationSec=t,e.provenance.durationSec=n}async function Ln(e,t,n,r){let i=Math.min(r,16384);await e.load(n,i,i);let a=e.chunkAt(n);if(!a)return null;let o=a.buf,s=a.base,c=s+o.length,l={bytes:0,blocks:0,video:0,large:0,smallBytes:0},u=n;for(;u<c;){let e=K(o,u-s,s);if(e?.id===524531317){u=e.dataStart;continue}if(!e||e.size===-1)break;let i=e.dataStart+e.size,a=e.id===163||e.id===160;if(a?e.size>268435456||i>n+r:i>c||!Tn.has(e.id))break;if(a){let n=e.id===160?K(o,e.dataStart-s,s):e,r=n&&(n.id===163||n.id===161)?Bt(o,n.dataStart-s,n.size):null,a=r&&t.some(e=>e.number===r.track)?r.laces:0;l.blocks+=Math.max(1,a),l.video+=a,i-e.pos>=4096?l.large++:l.smallBytes+=i-e.pos}l.bytes=i-n,u=i}return l.blocks&&l.bytes>0?l:null}function Rn(e,t,n){if(!t){if(!(n>0))return null;let t=e/n>=Z;return{blocks:n,large:t?n:0,smallBytes:t?0:e}}let r=e/t.bytes,i=t.video*r;return{blocks:t.blocks*r*(t.video>0&&n>i?n/i:1),large:t.large*r,smallBytes:t.smallBytes*r}}function zn(e,t,n){let r=Math.min(e,wn,t?.video?Math.ceil(48*t.bytes/t.video):wn);return a(n.costModel,Math.ceil(r/n.readAhead.head),r)}function Bn(e,t,n){let r=(t?.blocks??0)*n.costModel.perBlockMs,i=(e,t,i)=>({window:e,reads:t,bytes:i,ms:a(n.costModel,t,i)+r}),o=n.readAhead.matroskaScan,s=i(o,Math.ceil(e/o),e);if(!t)return s;let c=Math.ceil(t.large+t.smallBytes/Z),l=i(Z,c,Math.min(e,c*Z));return l.ms<s.ms?l:s}let Vn={newScanState:Y,addBlock:Wt};async function Hn(){try{return await Promise.resolve().then(()=>(Sn(),tn))}catch{return`the estimate code did not load`}}async function Un(e,t){try{return await t()}catch(t){return e.reader.checkAbort(),`the estimate failed: ${t instanceof Error?t.message:String(t)}`}}async function Wn(e,t,n,r){let i=e.reader,a=r.onProgress,o=i.reads,s=t.header.segmentEnd-n;a?.({phase:`matroska-exact`,done:0,total:s}),await $t(e,t,n,(e,t)=>{s=Math.max(s,t-n),a&&i.reads!==o&&(o=i.reads,a({phase:`matroska-exact`,done:Math.min(e-n,s),total:s}))}),a?.({phase:`matroska-exact`,done:s,total:s})}async function Gn(e,t){let n=t.firstCluster===null?null:await e.header(t.firstCluster);if(n?.id===524531317)return n.pos;let r=Math.max(t.segmentData,t.walkEnd),i=await yt(e,r,Math.min(t.segmentEnd,r+16777216),t.declaredEnd,{step:Cn});if(i>=0)return i;for(let n of(await Kn(e,t)).slice(0,4))if((await e.header(n))?.id===524531317)return n;return null}async function Kn(e,t){let n=t.cuesPos===null||t.cuesPos>=t.segmentEnd?null:await e.header(t.cuesPos);if(n?.id!==475249515||n.size===-1)return[];let r=Math.min(n.size,524288,e.size-n.dataStart);await e.load(n.dataStart,r,r);let i=[];return Ot(t,e.buf,n.dataStart-e.base,n.dataStart-e.base+r,Ue,i),[...new Set(i)].filter(e=>e<t.segmentEnd).sort((e,t)=>e-t)}function qn(e,t){return e.length<=t?[...e]:[...new Set(Array.from({length:t},(n,r)=>e[Math.round(r*(e.length-1)/(t-1))]))]}async function Jn(e,t,n,r,i){let a=Math.max(i.readAhead.tail,4096),o=t.segmentEnd,s=-1/0;for(;;){let i=Math.max(r,t.segmentEnd-a);for(let r of i<o?await en(e,i,o,t.declaredEnd):[]){let i=Y(t,e.size,n);if(await Zt(e,i,r),s=Math.max(s,i.maxAnyTicks),i.tracks.get(n[0].number)?.n)return{st:i,maxAnyTicks:s}}if(i<=r||a>=16777216)return null;o=i+4,a=Math.min(a*4,16777216)}}async function Yn(e,t,n,r,i,a,o){let s=await Jn(e,t,n,i,a),c=await Kn(e,t),l=qn(c[0]===i||!c.length?c:[i,...c.filter(e=>e>i)],8);if(!c.length){l=[i];let n=t.segmentEnd-i;for(let r=1;r<8;r++){let a=i+Math.floor(r*n/8),o=await yt(e,a,Math.min(t.segmentEnd,a+1048576),t.declaredEnd,{step:Cn});o>l[l.length-1]&&l.push(o)}}let u=new Map,d=null,f=0;for(let r of l){let a=Y(t,e.size,n);if(await Zt(e,a,r,32)){f++,r===i&&(d=a);for(let e of a.tracks.values()){if(e.n<2)continue;let t=u.get(e.track.number)??[];t.push(P({timescale:1e9/e.tickNs,pts:e.pts.subarray(0,e.n),tickQuantized:!0})),u.set(e.track.number,t)}}}o.push(`probe: ${f} cluster(s) sampled via ${c.length?`Cues`:`sync search`}, up to 32 video blocks each`),s||o.push(`probe: no video block found in the tail`),Fn(t,s?.maxAnyTicks??-1/0,o),n.forEach((e,n)=>{let i=r[n],a=i.timescale,o=An(a,u.get(e.number)??[]);o.isVfr===null?f>0&&i.warnings.push(`probe: every sampled cluster holds fewer than 2 frames of this track, so no frame interval was measured; scan all frames for min, max and VFR`):jn(i,o,`sampled`);let c=d?.tracks.get(e.number),l=c?.n?Math.min(...c.pts.subarray(0,c.n)):null;l!==null&&(i.startSec=l/a,i.provenance.startSec=`sampled`);let p=s?.st.tracks.get(e.number);p?.n&&In(i,(p.maxPts+(p.maxPtsDur>0?p.maxPtsDur:o.medianDelta??0)-(l??0))/a,`sampled`),Pn(t,e,i)})}function Xn(e,t){let n=e.timescale;if(e.frames=e.presentedFrames=t.frames,e.provenance.frames=e.provenance.presentedFrames=`computed`,e.isStill=t.frames===1,t.invisible&&e.warnings.push(`${t.invisible} invisible block(s) counted as frames`),t.missingPts&&e.warnings.push(`${t.missingPts} laced frame(s) without a timestamp`),t.noPtsFrames&&e.warnings.push(`${t.noPtsFrames} frame(s) before time 0 have no timestamp; interpolated from the neighbouring frames like ffmpeg`),t.overLimit&&e.warnings.push(`per-frame statistics skipped: more than ${t.n} frames`),!t.n||t.overLimit)return t.n||e.warnings.push(`no blocks for this track`),null;let r=P({timescale:n,pts:t.pts.subarray(0,t.n),lastDuration:t.maxPtsDur>0?t.maxPtsDur:null,tickQuantized:!0});return e.warnings.push(...r.warnings),In(e,r.durationSum/n,`exact`),jn(e,r,`exact`),e.avgFps=t.frames!==t.n&&Number.isSafeInteger(n)&&Number.isSafeInteger(r.durationSum)?_(n,t.frames,r.durationSum):r.avgFps,e.startSec=r.firstPts===null?null:r.firstPts/n,e.dominantFps=r.dominantFps,e.provenance.avgFps=e.provenance.startSec=e.provenance.dominantFps=`exact`,!e.nominalFps&&r.nominalFps?(e.nominalFps=r.nominalFps,e.provenance.nominalFps=`exact`):e.nominalFps&&e.avgFps&&Math.abs(e.avgFps.value/e.nominalFps.value-1)>.005&&e.warnings.push(`declared rate ${e.avgFpsFfprobe} differs from the measured average ${e.avgFps.value.toFixed(3)}`),r.duplicateTimestamps&&e.warnings.push(`${r.duplicateTimestamps} duplicate block timestamp(s) excluded from the instantaneous rates`),r.profile}async function Zn(e,t){let n=new ft(e,t.readAhead.head),r=await Pt(n),i=b(r.docType===`webm`?`webm`:`matroska`),a=i.warnings;i.brand=r.docType,i.scan=`header`,a.push(...r.warnings),r.docType!==`webm`&&r.docType!==`matroska`&&a.push(`unexpected DocType '${r.docType}'`),r.segmentUnknownSize&&a.push(`Segment has an unknown size (live or unfinished recording)`),i.formatDurationSec=r.duration===0?null:Math.trunc(r.duration*r.timestampScale*1e3/1e6)/1e6,i.audioTrackCount=r.tracks.filter(e=>e.type===2).length,r.attachedImages&&a.push(`${r.attachedImages} attached image(s) ignored: ffprobe lists them as attached_pic video streams`);let o=r.tracks.filter(e=>e.type===1);if(!o.length)return a.push(`no video track`),i;i.primaryTrackId=o[0].number,i.videoTracks=o.map(e=>Mn(r,e));let s=t.matroskaMode,c=null;if(s!==`header`&&(c=await Gn(n,r),c===null&&a.push(`no Cluster found: nothing to scan`)),c===null)return o.forEach((e,t)=>Pn(r,e,i.videoTracks[t])),i;let l=r.segmentEnd-c,u=o[0],d=r.tagDurations.get(u.uid)??Nn(r),f=d>0&&u.defaultDuration>0?d*1e9/u.defaultDuration:0,p=await Ln(n,o,c,l),m=Bn(l,Rn(l,p,f),t),h=u.defaultDuration?null:await Hn();if(s===`auto`){let e=typeof h==`object`&&h&&!h.setupUnsupported(r)?zn(l,p,t):0;s=m.ms<=t.exactBudgetMs+e?`exact`:`probe`;let n=e?` plus the ${e.toFixed(0)} ms that probe mode reads for the ffprobe estimate`:``;s===`probe`&&a.push(`exact block scan skipped: predicted ${m.ms.toFixed(0)} ms exceeds the ${t.exactBudgetMs} ms budget${n}`)}let g=i.videoTracks[0],_=e=>{typeof e!=`string`&&(g.avgFpsFfprobe=e.avg,g.rFpsFfprobe=e.r),g.warnings[g.warnings.indexOf(Dn)]=typeof e==`string`?`${En}not reproduced (${e})`:`${En}estimated like ffprobe from ${e.packets} video packets`};if(s===`exact`){n.window=m.window;let s=Y(r,n.size,o,t.maxExpandedSamples);m.window<t.readAhead.matroskaScan&&(s.switchReads=e.reads+2*m.reads+16,s.largeWindow=t.readAhead.matroskaScan);let l=typeof h==`object`&&h?h.attachEstimate(n,r,Vn,s):h;await Wn(n,s,c,t),l!==null&&_(typeof l==`function`?await Un(n,l):l),i.scan=`exact`,a.push(...s.warnings),s.truncated&&a.push(`truncated file: the last Cluster or block ends beyond EOF`),s.missingClusterTs&&a.push(`${s.missingClusterTs} block(s) in Clusters without a Timestamp`),Fn(r,s.maxAnyTicks,a);for(let[e,t]of o.entries()){let n=i.videoTracks[e];n.rateProfile=await de(Xn(n,s.tracks.get(t.number)))}return i}if(h!==null){let e=Y(r,n.size,[]),t=typeof h==`string`?h:h.attachEstimate(n,r,Vn,e,!0);_(typeof t==`string`?t:await Un(n,()=>$t(n,e,c).then(t)))}return n.window=m.window===4096?Z:t.readAhead.head,await Yn(n,r,o,i.videoTracks,c,t,a),i.scan=`probe`,i}function Qn(e){if(e?.aborted)throw e.reason??new DOMException(`Aborted`,`AbortError`)}function Q(e,t){if(!Number.isSafeInteger(e)||e<0)throw RangeError(`${t} must be a non-negative safe integer, got ${e}`)}var $n=class{size;headWindow;maxWindows;signal;#e;#t=[];#n=[];#r=0;#i=0;constructor(e,t={}){Q(e.size,`blob size`),this.#e=e,this.size=e.size,this.headWindow=t.headWindow??65536,this.maxWindows=Math.max(1,t.maxWindows??4),this.signal=t.signal??null,Q(this.headWindow,`headWindow`)}get reads(){return this.#r}get bytesFetched(){return this.#i}checkAbort(){Qn(this.signal)}async read(e,t){if(Q(e,`offset`),Q(t,`length`),e>this.size)throw RangeError(`offset ${e} is beyond the end of the file (${this.size})`);let n=Math.min(this.size,e+t);if(n===e)return new Uint8Array;this.checkAbort();let r;try{r=await this.#e.slice(e,n).arrayBuffer()}catch(e){throw this.checkAbort(),e?.name===`AbortError`?e:Error(`file read failed: ${e}`)}if(this.checkAbort(),this.#r++,r.byteLength!==n-e)throw Error(`file read failed: short read at ${e}: expected ${n-e} bytes, got ${r.byteLength}`);return this.#a(e,n),new Uint8Array(r)}async readMany(e,t=4){let n=Array(e.length),r=0,i=async()=>{for(;r<e.length;){let t=r++,[i,a]=e[t],o=this.peek(i,a);n[t]=o?new Uint8Array(o.buffer,o.byteOffset,o.byteLength):await this.read(i,a)}},a=[];for(let n=0;n<Math.max(1,Math.min(t,e.length));n++)a.push(i());return await Promise.all(a),n}peek(e,t){let n=Math.min(this.size,e+t);for(let t=0;t<this.#t.length;t++){let r=this.#t[t];if(e>=r.off&&n<=r.off+r.buf.length)return t>0&&(this.#t.splice(t,1),this.#t.unshift(r)),new DataView(r.buf.buffer,r.buf.byteOffset+(e-r.off),n-e)}return null}async view(e,t,n=this.headWindow){if(Q(e,`offset`),Q(t,`length`),Q(n,`readAhead`),e>this.size)throw RangeError(`offset ${e} is beyond the end of the file (${this.size})`);let r=Math.min(this.size,e+t);if(r===e)return new DataView(new ArrayBuffer(0));let i=this.peek(e,r-e);if(i)return i;let a=Math.min(this.size,Math.max(r,e+n)),o=this.#t.find(t=>e>=t.off&&e<t.off+t.buf.length),s;if(o){let t=o.buf.subarray(e-o.off),n=await this.read(o.off+o.buf.length,a-(o.off+o.buf.length));s=new Uint8Array(t.length+n.length),s.set(t,0),s.set(n,t.length)}else s=await this.read(e,a-e);return this.#t.unshift({off:e,buf:s}),this.#t.length>this.maxWindows&&(this.#t.length=this.maxWindows),new DataView(s.buffer,s.byteOffset,r-e)}async bytes(e,t,n=this.headWindow){let r=await this.view(e,t,n);return new Uint8Array(r.buffer,r.byteOffset,r.byteLength)}#a(e,t){let n=this.#n,r=0,i=n.length;for(;r<i;){let t=r+i>>>1;n[t].end<e?r=t+1:i=t}let a=r,o=e,s=t,c=0;for(;a<n.length&&n[a].start<=t;){let r=n[a],i=Math.min(t,r.end)-Math.max(e,r.start);i>0&&(c+=i),r.start<o&&(o=r.start),r.end>s&&(s=r.end),a++}n.splice(r,a-r,{start:o,end:s}),this.#i+=t-e-c}};let er=new Set([`ftyp`,`moov`,`mdat`,`free`,`skip`,`wide`,`pnot`,`uuid`,`moof`,`styp`,`sidx`]),tr=[26,69,223,163],nr=[{bytes:[137,80,78,71,13,10,26,10],offset:0,label:`PNG image`},{bytes:[255,216,255],offset:0,label:`JPEG image`},{bytes:[71,73,70,56],offset:0,label:`GIF image`},{bytes:[82,73,70,70],offset:0,label:`RIFF file (AVI/WAV/WebP)`},{bytes:[79,103,103,83],offset:0,label:`Ogg file`},{bytes:[70,76,86,1],offset:0,label:`FLV file`},{bytes:[0,0,1,186],offset:0,label:`MPEG program stream`},{bytes:[37,80,68,70],offset:0,label:`PDF document`},{bytes:[80,75,3,4],offset:0,label:`ZIP archive`},{bytes:[73,68,51],offset:0,label:`MP3 file`}];function rr(e,t,n){if(e.length<n+t.length)return!1;for(let r=0;r<t.length;r++)if(e[n+r]!==t[r])return!1;return!0}function ir(e){for(let t=4;t<8;t++){let n=e[t];if(n<32||n>126)return!1}return!0}function ar(e){let t=Math.min(e.length,512);if(t===0)return!1;for(let n=0;n<t;n++){let t=e[n];if(t!==9&&t!==10&&t!==13&&(t<32||t===127))return!1}return!0}function or(e){for(let t of nr)if(rr(e,t.bytes,t.offset))return t.label;return e.length>=188&&e[0]===71&&e[188]===71?`MPEG transport stream`:ar(e)?`text file`:`no known signature`}function sr(e){if(e.length===0)return{kind:`unknown`,reason:`empty file`};if(rr(e,tr,0))return{kind:`matroska`,reason:`EBML header 1A45DFA3`};if(e.length>=8&&ir(e)){let t=String.fromCharCode(e[4],e[5],e[6],e[7]);if(er.has(t)){let n=e[0]*16777216+e[1]*65536+e[2]*256+e[3];if(n===0)return{kind:`isobmff`,reason:`top-level '${t}' box running to end of file`};if(n>=8)return{kind:`isobmff`,reason:`top-level '${t}' box`};if(n===1){if(e.length<16)return{kind:`unknown`,reason:`'${t}' box with a truncated 64-bit size`};let n=0;for(let t=8;t<16;t++)n=n*256+e[t];if(n>=16)return{kind:`isobmff`,reason:`top-level '${t}' box with 64-bit size`}}return{kind:`unknown`,reason:`'${t}' box with invalid size ${n}`}}}return e.length<8?{kind:`unknown`,reason:`too small (${e.length} bytes)`}:{kind:`unknown`,reason:or(e)}}async function cr(e){let{kind:t}=sr(new Uint8Array(await e.slice(0,Math.min(1024,e.size)).arrayBuffer()));return t===`unknown`?null:t}c();function lr(e,t){let{perReadMs:n,bytesPerMs:r}=t.costModel,i=t.readAhead.head;return e<Math.max(i,Math.min(i+n*r,1048576))?e:i}function ur(e){return e?.name===`AbortError`}function dr(e){return e instanceof Error?e.message||e.name:String(e)}function fr(e,t){e.container=t.container,e.brand=t.brand,e.formatDurationSec=t.formatDurationSec,e.scan=t.scan,e.videoTracks=t.videoTracks,e.audioTrackCount=t.audioTrackCount,e.primaryTrackId=t.primaryTrackId,e.error=t.error,e.warnings=t.warnings}async function pr(e,t,n,r){let a=performance.now(),o=i(n);Qn(o.signal);let s={name:t,size:e.size,...b(`unknown`),io:{reads:0,bytesRead:0,ms:0},engine:`own`},c=null,l=0;try{if(c=new $n(e,{headWindow:o.readAhead.head,signal:o.signal}),c.size===0)s.error=`not a recognised container: empty file`;else{let e=sr(await c.bytes(0,Math.min(1024,c.size),lr(c.size,o)));if(e.kind===`unknown`)s.error=`not a recognised container: ${e.reason}`;else{s.container=e.kind===`isobmff`?`mp4`:`matroska`;let t=performance.now(),n=await r(e.kind);l=performance.now()-t,fr(s,await n(c,o))}}}catch(e){if(o.signal?.aborted||ur(e))throw e;s.error=dr(e)}return c&&(s.io.reads=c.reads,s.io.bytesRead=c.bytesFetched),s.io.ms=performance.now()-a-l,s}let $=(e,t)=>Object.assign(Error(e),{code:t}),mr=e=>e===`isobmff`||e===`matroska`;function hr(e){let t=self,n=new Map,r=new Map,i=e=>t.postMessage({v:1,...e}),a=t=>{let r=n.get(t);if(!r){let i=Object.hasOwn(e,t)?e[t]:void 0;if(!i)return Promise.reject($(`unknown engine ${t}`,`unknown-engine`));r=(typeof i==`function`?Promise.all([i(),Promise.resolve().then(()=>(ke(),A))]).then(([e])=>e):Promise.resolve(i)).catch(e=>{throw n.delete(t),e}),n.set(t,r)}return r},o=(e,t,n=!1,r=!1)=>{let a=t?.code,o=a===`unknown-engine`||a===`protocol`;i({type:`error`,id:e,message:dr(t),aborted:n||ur(t),...o?{code:a}:r&&{reason:`load`}})},s=async e=>{let t=new AbortController;r.set(e.id,t);let n=0,s=!0;try{if(!(e.file instanceof Blob))throw $(`malformed analyze request`,`protocol`);let r=await a(e.engine);if(s=!1,r.containers!==`any`){let t=await cr(e.file);if(!t||!r.containers.includes(t))return i({type:`skipped`,id:e.id,reason:`unsupported-container`,family:t})}let o=await r.run(e.file,e.name,{...e.options,signal:t.signal,onProgress:t=>{let r=performance.now();r-n<50||(n=r,i({type:`progress`,id:e.id,progress:t}))}});i({type:`result`,id:e.id,result:o})}catch(n){o(e.id,n,t.signal.aborted,s)}finally{r.delete(e.id)}},c=async e=>{try{if(![e.engines,e.containers].every(Array.isArray)||!e.containers.every(mr))throw $(`malformed warm request`,`protocol`);await Promise.all(e.engines.map(async t=>(await a(t)).warm?.(e.containers))),i({type:`warmed`,id:e.id})}catch(t){o(e.id,t,!1,!0)}};t.onmessage=({data:e})=>{if(e?.v!==1)return o(e?.id??0,$(`unsupported protocol version ${e?.v}`,`protocol`));if(e.type===`cancel`)r.get(e.id)?.abort();else if(e.type===`analyze`)s(e);else if(e.type===`warm`)c(e);else{let t=e;o(t.id,$(`unknown request type ${t.type}`,`protocol`))}}}let gr={isobmff:`ISO BMFF`,matroska:`Matroska`},_r=(e,t)=>`the own ${gr[e]} worker does not read ${gr[t]}`;function vr(e,t){return{containers:`any`,run:(n,r,i)=>pr(n,r,i,n=>{if(n!==e)throw Error(_r(e,n));return t})}}hr({own:vr(`matroska`,Zn)})})();