video-fps-probe 0.3.0 → 0.4.0-beta.1

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 (72) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +18 -12
  3. package/dist/api/codes.d.ts +6 -0
  4. package/dist/api/codes.js +88 -0
  5. package/dist/cjs/analyze.d.cts +9 -0
  6. package/dist/cjs/api/agreement.d.cts +18 -0
  7. package/dist/cjs/api/codes.d.cts +6 -0
  8. package/dist/cjs/api/errors.d.cts +12 -0
  9. package/dist/cjs/api/guards.d.cts +4 -0
  10. package/dist/cjs/api/summary.d.cts +22 -0
  11. package/dist/cjs/check/index.d.cts +60 -0
  12. package/dist/cjs/check.cjs +1 -0
  13. package/dist/cjs/chunks/build-CT5g6_bs.cjs +1 -0
  14. package/dist/cjs/chunks/compare-D7RVqlqf.cjs +1 -0
  15. package/dist/cjs/chunks/errors-0oBg1Ai6.cjs +1 -0
  16. package/dist/cjs/chunks/fallback-D9Ak2zFv.cjs +1 -0
  17. package/dist/cjs/chunks/guards-Dqpjtkdn.cjs +1 -0
  18. package/dist/cjs/chunks/inline-Bx-TQg8f.cjs +1 -0
  19. package/dist/cjs/chunks/isobmff-B_bb5rS5.cjs +1 -0
  20. package/dist/cjs/chunks/matroska-CLoGzfKA.cjs +1 -0
  21. package/dist/cjs/chunks/probe-DDLUfr23.cjs +1 -0
  22. package/dist/cjs/chunks/rational-Dq5Vza-Q.cjs +1 -0
  23. package/dist/cjs/chunks/reader-DNLR-_tm.cjs +1 -0
  24. package/dist/cjs/chunks/rfps-C-pyKnu8.cjs +1 -0
  25. package/dist/cjs/chunks/runtime-DtgT0xzU.cjs +1 -0
  26. package/dist/cjs/chunks/segments-i-hPN7H3.cjs +1 -0
  27. package/dist/cjs/chunks/sniff-CXwqOGwh.cjs +1 -0
  28. package/dist/cjs/chunks/stats-D68frkk2.cjs +1 -0
  29. package/dist/cjs/client/types.d.cts +96 -0
  30. package/dist/cjs/core/reader.d.cts +47 -0
  31. package/dist/cjs/core/types.d.cts +149 -0
  32. package/dist/cjs/engines/types.d.cts +69 -0
  33. package/dist/cjs/header/index.d.cts +25 -0
  34. package/dist/cjs/header/limits.d.cts +25 -0
  35. package/dist/cjs/header.cjs +1 -0
  36. package/dist/cjs/index.cjs +1 -0
  37. package/dist/cjs/index.d.cts +13 -0
  38. package/dist/cjs/plugins/types.d.cts +17 -0
  39. package/dist/cjs/presets/index.d.cts +19 -0
  40. package/dist/cjs/presets.cjs +1 -0
  41. package/dist/cjs/probe.d.cts +3 -0
  42. package/dist/cjs/url/index.d.cts +47 -0
  43. package/dist/cjs/url.cjs +1 -0
  44. package/dist/cjs/worker/protocol.d.cts +47 -0
  45. package/dist/core/dispatch.js +18 -29
  46. package/dist/core/isobmff/boxes.js +6 -5
  47. package/dist/core/isobmff/build.js +398 -0
  48. package/dist/core/isobmff/header.js +654 -0
  49. package/dist/core/isobmff/index.js +9 -381
  50. package/dist/core/isobmff/moof.js +2 -2
  51. package/dist/core/isobmff/moov.js +2 -2
  52. package/dist/core/matroska/header.js +9 -4
  53. package/dist/core/matroska/index.js +7 -3
  54. package/dist/core/reader.d.ts +3 -0
  55. package/dist/core/reader.js +13 -7
  56. package/dist/core/result.js +1 -0
  57. package/dist/core/stats.js +3 -0
  58. package/dist/core/types.d.ts +15 -1
  59. package/dist/engines/common.js +2 -0
  60. package/dist/header/index.d.ts +25 -0
  61. package/dist/header/index.js +146 -0
  62. package/dist/header/limits.d.ts +25 -0
  63. package/dist/header/limits.js +140 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.js +1 -0
  66. package/dist/standalone/own-isobmff.worker.js +1 -1
  67. package/dist/standalone/own-matroska.worker.js +1 -1
  68. package/dist/standalone/own.worker.js +1 -1
  69. package/dist/url/index.d.ts +47 -0
  70. package/dist/url/index.js +335 -0
  71. package/dist/worker/single.js +2 -1
  72. package/package.json +79 -2
@@ -0,0 +1 @@
1
+ const e=require("./guards-Dqpjtkdn.cjs"),t=require("./reader-DNLR-_tm.cjs"),n=require("./rational-Dq5Vza-Q.cjs"),r=require("./stats-D68frkk2.cjs"),i=408125543,a=290298740,o=19899,s=21419,c=21420,l=357149030,u=2807729,d=17545,f=374648427,p=29637,m=2352003,h=2306383,g=22186,_=25506,v=28032,y=2327523,b=475249515,x=307544935,S=29555,C=25536,w=25541,T=26568,E=17827,D=17543,O=423732329,k=24999,A=18016,j=272869232,M=30114,N=new Set([a,l,f,b,x,524531317,j,O]);function vintLength(e){return e===0?0:Math.clz32(e)-23}function readId(e,t){if(t>=e.length)return null;let n=vintLength(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 readSize(e,t){if(t>=e.length)return null;let n=e[t],r=vintLength(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 readHeader(e,t,n){let r=readId(e,t);if(!r)return null;let i=readSize(e,t+r.length);return i?{id:r.id,pos:n+t,size:i.size,dataStart:n+t+r.length+i.length}:null}function headerShort(e,t){if(t>=e.length)return!0;let n=vintLength(e[t]);if(n<1||n>4)return!1;let r=t+n;return r>=e.length||e[r]!==0&&r+vintLength(e[r])>e.length}function readVint(e,t,n){let r=t<n?vintLength(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 readUint(e,t,n){let r=0;for(let i=0;i<n;i++)r=r*256+e[t+i];return r}function readUintBig(e,t,n){let r=0n;for(let i=0;i<n;i++)r=r<<8n|BigInt(e[t+i]);return r}function readFloat(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}const P=new TextDecoder;function readString(e,t,n){let r=t;for(;r<t+n&&e[r]!==0;)r++;return P.decode(e.subarray(t,r)).replace(/[^\x20-\x7e\xa0-\uffff]/g,`?`)}function*children(e,t,n){let r=t,i=Math.min(n,e.length);for(;r<i;){let t=readHeader(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 childUint(e,t){return t.size>6?Number(readUintBig(e,t.start,t.size)):readUint(e,t.start,t.size)}var ByteSource=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),readHeader(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)}};const F=new Map([[a,[o]],[l,[u,d,19840,22337,29604,17505,31657,29572,3979555,3965867,4110627,4096955,17476,26916]],[f,[174]],[b,[187]],[x,[S]],[j,[17849]],[O,[k]]]),I=new Uint8Array(256);for(let e of N)I[e>>>24]=1;const L=new Uint8Array(256);L[31]=1;function isClusterAt(e,t,n){if(e[t]!==31||e[t+1]!==67||e[t+2]!==182||e[t+3]!==117)return!1;let r=readSize(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=readId(e,i);if(!t)return!1;let n=readSize(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 level1At(e,t,n,r){let i=readId(e,t);if(i?.length!==4)return!1;if(i.id===524531317)return isClusterAt(e,t,n);let a=F.get(i.id),o=readSize(e,t+4);if(!a||!o||o.size<2)return!1;let s=t+4+o.length+o.size,c=s<=r?readHeader(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 findForward(e,t,n,r,i={}){let a=i.clustersOnly?L:I,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 findClusterForward(e,t,n,r,i={}){return findForward(e,t,n,(e,t,n)=>isClusterAt(e,t,r-n),{...i,clustersOnly:!0})}function findLevel1Forward(e,t,n,r,i={}){let a=e.size;return findForward(e,t,n,(e,t,n)=>level1At(e,t,r-n,a-n),i)}const R=new Map([[a,`SeekHead`],[l,`Info`],[x,`Tags`]]),z=new Set([a,l,f,x,O]),B=new Map([[a,[o]],[o,[s,c]],[l,[u,d]],[f,[174]],[174,[215,p,131,185,134,_,v,m,h,g,224]],[224,[176,186,y]],[x,[S]],[S,[C,T]],[C,[w]],[T,[E,D,T]],[O,[k]],[k,[A]],[b,[187]],[187,[183]],[183,[241]]]),hex=e=>e.toString(16).toUpperCase();function withinHeaderBudget(e,t=0){return e.reader.reads<5&&e.reader.bytesFetched+Math.max(t,e.window)<=1048576}function parseDurationTag(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 newTrack(){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 finishTrack(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 parseMaster(e,t,n,r,i,a=null,l=null){let f=l??newTrack(),b=-1,x=-1,C=[],O=[],k=``,j=``,M=!1,walk=(n,r,i,l)=>{let N=B.get(n)??[];if(l>16)M=!0;else for(let M of children(t,r,i)){if(!N.includes(M.id))continue;let r=M.start,i=M.size,uint=()=>childUint(t,M),nest=()=>walk(M.id,r,r+i,l+1);switch(M.id){case 174:f=newTrack(),nest(),finishTrack(e,f);break;case S:C=[],O=[],nest();for(let t of O)for(let n of C.length?C:[0n])e.tagDurations.has(n)||e.tagDurations.set(n,t);break;case T:{let e=[k,j];k=j=``,nest();let t=n===29555&&(k===`DURATION`||k.startsWith(`DURATION-`))?parseDurationTag(j):null;t!==null&&O.push(t),[k,j]=e;break}case o:b=x=-1,nest(),b>=0&&x>=0&&!e.seek.has(b)&&e.seek.set(b,e.segmentData+x);break;case 215:f.number=uint();break;case p:f.uid=readUintBig(t,r,i);break;case 131:f.type=uint();break;case 185:f.disabled=!uint();break;case 134:f.codecId=readString(t,r,i);break;case m:f.defaultDuration=uint();break;case h:f.trackTimestampScale=readFloat(t,r,i);break;case g:f.codecDelay=uint();break;case v:f.encoded=!0;break;case _:f.codecPrivate=t.slice(r,r+Math.min(i,4096));break;case 176:f.width=uint();break;case 186:f.height=uint();break;case y:f.frameRate=readFloat(t,r,i);break;case u:uint()>0&&(e.timestampScale=uint());break;case d:{let n=readFloat(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 s:b=i<=4?uint():-1;break;case c:x=uint();break;case w:C.push(readUintBig(t,r,i));break;case E:k=readString(t,r,i).toUpperCase();break;case D:j=readString(t,r,i);break;case A:readString(t,r,i).startsWith(`image/`)&&e.attachedImages++;break;case 241:a?.push(e.segmentData+uint());break;default:nest()}}};walk(i,n,r,2),M&&e.warnings.push(`elements nested deeper than 16 levels ignored`)}async function headerIn(e,t){return e.cached(t,12)||withinHeaderBudget(e)?e.header(t):null}async function sparseTracks(e,t,n){let r=Math.min(n.dataStart+n.size,e.size),i=n.dataStart;for(;i<r;){let n=await headerIn(e,i);if(!n||n.size===-1)break;let a=Math.min(n.dataStart+n.size,r);if(n.id===174){let r=newTrack();for(let i=n.dataStart;i<a;){let n=await headerIn(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)||withinHeaderBudget(e,o))&&(await e.load(n.pos,o),parseMaster(t,e.buf,n.pos-e.base,n.pos-e.base+o,174,null,r)),i=n.pos+o}finishTrack(t,r)}i=n.dataStart+n.size}i<r&&t.warnings.push(`Tracks at ${n.pos} only partly read (header budget)`)}async function parseLevel1(e,t,n,r){if(r.at.add(n.pos),n.id===475249515&&(t.cuesPos??=n.pos),!z.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 sparseTracks(e,t,n);return}if(!o&&(!withinHeaderBudget(e,a)||n.id===423732329)){n.id===374648427?(r.ids.add(n.id),await sparseTracks(e,t,n)):n.id!==423732329&&t.warnings.push(`${R.get(n.id)??hex(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;parseMaster(t,e.buf,s,s+a,n.id)}function extendSegment(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 findSegment(e,t,n){let r=n;for(let n=0;n<16&&r<e.size;n++){if(!e.cached(r,12)&&!withinHeaderBudget(e))return t.warnings.push(`Segment search stopped at ${r} (header budget)`),null;let n=await e.header(r),a=e.buf,o=r-e.base;if(a[o]===24&&a[o+1]===83&&a[o+2]===128&&a[o+3]===103)return n||(t.warnings.push(`corrupt Segment size at ${r}`),t.segmentExtended=!0,{id:i,pos:r,size:-1,dataStart:r+4+(vintLength(a[o+4])||8)});if(!n||n.size===-1)return null;r=n.dataStart+n.size}return null}async function readMatroskaHeader(e){let n={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:[]},r=await e.header(0);if(!r||r.id!==440786851||r.size===-1||r.dataStart+r.size>e.size)throw t.a(`corrupt`,`invalid EBML header`);await e.load(r.dataStart,Math.min(r.size,4096));let o=r.dataStart-e.base;for(let t of children(e.buf,o,o+r.size))t.id===17026&&(n.docType=readString(e.buf,t.start,t.size));let canLoad=()=>withinHeaderBudget(e),s=await findSegment(e,n,r.dataStart+r.size);if(!s){let a=await findLevel1Forward(e,r.dataStart+r.size,e.size,e.size,{canLoad});if(a<0)throw t.a(`no-header`,`no Segment element`);n.warnings.push(`no valid Segment header: reading level-1 elements from ${a}`),n.segmentExtended=!0,s={id:i,pos:a,size:-1,dataStart:a}}n.segmentData=s.dataStart,n.segmentUnknownSize=s.size===-1&&!n.segmentExtended,n.declaredEnd=s.size===-1?2**53-1:s.dataStart+s.size,n.segmentEnd=Math.min(e.size,n.declaredEnd),n.declaredEnd>e.size&&s.size!==-1&&n.warnings.push(`truncated file: Segment ends ${n.declaredEnd-e.size} bytes after EOF`);let c={ids:new Set,at:new Set},u=n.segmentData,d=u,p=-1;for(;!(u>=n.segmentEnd&&(u>=e.size||(extendSegment(n,e,`Segment ends at ${u} before any Cluster`),u>=n.segmentEnd)));){if(!e.cached(u,12)&&!canLoad()){n.warnings.push(`header walk stopped at ${u} (header budget)`),p=u;break}let t=await e.header(u);if(t?.id===524531317){n.firstCluster=u;break}let r=`invalid data at ${u} before the first Cluster`;if(t&&t.size!==-1&&(N.has(t.id)||t.id===236||t.id===191)){let i=t.dataStart+t.size;if(i>n.segmentEnd&&i<=e.size&&extendSegment(n,e,`${hex(t.id)} at ${u} ends after the Segment`),await parseLevel1(e,n,t,c),d=u+1,i<=e.size){u=i;continue}r=`${hex(t.id)} at ${u} ends after the end of the file`}let i=await findLevel1Forward(e,d,e.size,Math.max(n.declaredEnd,e.size),{canLoad});if(n.warnings.push(i<0?r:`${r}: resynchronised at ${i}`),i<0)break;i>=n.segmentEnd&&extendSegment(n,e,`level-1 element at ${i} after the Segment end`),d=i+1,u=i}n.walkEnd=n.firstCluster??(p>=0?p:d);for(let t of[a,l,f,x]){let r=n.seek.get(t);if(r===void 0||c.at.has(r)||t!==290298740&&c.ids.has(t)||r>=n.segmentEnd)continue;let i=await headerIn(e,r);i?.id===t?await parseLevel1(e,n,i,c):n.warnings.push(`SeekHead entry ${hex(t)} not followed`)}if(n.cuesPos??=n.seek.get(475249515)??null,c.ids.has(357149030)||n.warnings.push(`no Info element: TimestampScale 1000000 assumed`),!n.tracks.length)throw c.ids.has(374648427)?t.a(`truncated`,`no complete TrackEntry in Tracks`):t.a(`no-header`,`no Tracks element found`);return n}const V=2147483647n,H=new Set([231,163,160,167,171,236,191]),U=new Set([161,155,251,M,30113,164,236,191]),W=new Set([231,155,251,M]);function newScanState(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 pushPts(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 parseBlockHeader(e,t,n){let r=Math.min(e.length,t+n),i=readVint(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 bigVint(e,t,n,r){if(t>=n)return`invalid`;if(t>=r)return`more`;let i=vintLength(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 parseBlock(e,t,n,r){let i=t+n,a=Math.min(i,e.length),o=parseBlockHeader(e,t,a-t);if(!o){let n=t<a?vintLength(e[t]):0;return a<i&&(t>=a||n>0&&t+n+4>a)?`more`:`invalid`}let s=t+vintLength(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=bigVint(e,d,i,a);if(typeof f==`string`)return f;if(f.v>V)return`invalid`;let p=f.v,m=f.v;d+=f.n;for(let t=1;t<u-1;t++){if(f=bigVint(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>V)return`invalid`;p=t,m+=t,d+=f.n}return BigInt(i-d)<m?`invalid`:o}function emit(e,t,n,r){t.n<e.maxSamples?pushPts(t,n,e.maxSamples):t.overLimit++,n>=t.maxPts&&(t.maxPts=n,t.maxPtsDur=r),t.nextPts=n+r}function addBlock(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),off=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(off(t+1)-off(t)):emit(e,a,a.nextPts,off(t+1)-off(t));return a}let c=a.track.trackTimestampScale,l=(c===1?n:Math.floor(n/c))+t.rel-a.codecDelayTicks,u=l;for(let e of a.pending)u-=e;for(let t of a.pending.splice(0))emit(e,a,u,t),u+=t;for(let t=0;t<o;t++){if(t>0&&s===0){a.missingPts+=o-t;break}emit(e,a,l+off(t),off(t+1)-off(t))}return a}async function readBlock(e,t,n){let r=Math.min(n.size,16);for(;;){e.has(n.dataStart,r)||await e.load(n.dataStart,r);let i=parseBlock(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 cachedHeader(e,t){return e.has(t,12)?readHeader(e.buf,t-e.base,e.base):void 0}async function headerAt(e,t){return(cachedHeader(e,t)??await e.header(t))||(headerShort(e.buf,t-e.base)?`eof`:`invalid`)}function uintIn(e,t){return e.has(t.dataStart,t.size)?readUint(e.buf,t.dataStart-e.base,t.size):void 0}async function uintAt(e,t){return await e.load(t.dataStart,t.size),readUint(e.buf,t.dataStart-e.base,t.size)}function checkChild(e,t){return e.size===-1||e.dataStart+e.size>t||W.has(e.id)&&e.size>8||(e.id===163||e.id===161)&&e.size>268435456?`invalid`:null}async function walkCluster(e,t,n,r=1/0){let i=cachedHeader(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,fail=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}:fail(`eof`);let n=cachedHeader(e,l);if(n||=await headerAt(e,l),typeof n==`string`)return fail(n);let i=H.has(n.id);if(!i&&o===1/0&&(N.has(n.id)||n.id===408125543))return{next:l,videoBlocks:c,error:null};let u=checkChild(n,o);if(u)return fail(u);i&&(t.lastGood=l);let d=n.dataStart+n.size;if(d>a)return fail(`eof`);if(n.id===231)s=uintIn(e,n)??await uintAt(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<d;){let n=cachedHeader(e,a)||await headerAt(e,a),o=typeof n==`string`?n:checkChild(n,d);if(o||typeof n==`string`)return l=a,fail(o??`invalid`);U.has(n.id)&&(t.lastGood=a),n.id===161?r=n:n.id===155&&(i=uintIn(e,n)??await uintAt(e,n)),a=n.dataStart+n.size}}if(r){let n=e.has(r.dataStart,Math.min(r.size,16))?parseBlock(e.buf,r.dataStart-e.base,r.size,t.known):`more`;if(n===`more`&&(n=await readBlock(e,t,r)),n===`invalid`)return fail(`invalid`);s<0&&(t.missingClusterTs++,s=0);let a=addBlock(t,n,s,i);t.onBlock?.(n,s,i,r),a&&a.track.type===1&&c++}}l=d}return{next:o,videoBlocks:c,error:null}}function noteResync(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 scanSegment(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 findLevel1Forward(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 headerAt(e,s);if(typeof c==`string`)n=c;else{let r=N.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 walkCluster(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 findLevel1Forward(e,t.lastGood+1,a,1/0);if((n!==`invalid`||i!==t.afterSegment)&&noteResync(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 findLastClusters(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&&isClusterAt(i,e,r-a)&&o.push(a+e);return o}const G=4096,K=16777216,q=524288,J=262144,Y=5e6,X=new Set([231,236,191,167,171]),ee=t.o.perBlockMs,Z=`no DefaultDuration: avg_frame_rate and r_frame_rate `,Q=`${Z}come from the first packets, which header mode does not read`;function codecNameOf(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 declaredRate(e){if(!(e>0))return null;let t=n.a(1e9,e,3e4),r=n.o(t);return{avg:r,r:t.num<t.den*1e3&&t.num>t.den*5?r:null}}function mergeRunStats(e,t){let n=new Map,i={minFps:null,maxFps:null,isVfr:null,vfrRatio:0,distinctDeltas:0,duplicateTimestamps:0,timestampsQuantized:!1,medianDelta:null,medianFrameInterval:null},a=0;for(let e of t){i.duplicateTimestamps+=e.duplicateTimestamps;for(let[t,r]of e.histogram)n.set(t,(n.get(t)??0)+r),a+=r}let o=[...n.keys()].sort((e,t)=>e-t);if(i.distinctDeltas=o.length,a===0)return i;let s=0,c=o.find(e=>(s+=n.get(e)??0)*2>=a)??o[0],l=r.vfrTolerance(c,e,o),u=0;for(let e of o)Math.abs(e-c)>l&&(u+=n.get(e)??0);i.medianDelta=c;let d=r.rateFromTicks(e,c);return i.medianFrameInterval=d&&{num:d.den,den:d.num,value:d.den/d.num},i.minFps=r.rateFromTicks(e,o[o.length-1]),i.maxFps=r.rateFromTicks(e,o[0]),i.isVfr=a>=2&&u>0,i.vfrRatio=u/a,i.timestampsQuantized=!i.isVfr&&o.length>1,i}function fillRates(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,e.medianFrameInterval=t.medianFrameInterval;for(let t of[`minFps`,`maxFps`,`isVfr`,`duplicateTimestamps`,`medianFrameInterval`])e.provenance[t]=n}function headerTrack(t,r){let i=e.l(r.number);i.fourccOrCodecId=r.codecId,i.codecName=codecNameOf(r.codecId),i.width=r.width,i.height=r.height,i.enabled=!r.disabled,i.timescale=1e9/(Math.trunc(t.timestampScale*r.trackTimestampScale)||t.timestampScale),i.provenance.codec=i.provenance.dimensions=`header`;let a=declaredRate(r.defaultDuration);a?(i.avgFpsFfprobe=a.avg,i.rFpsFfprobe=a.r,i.nominalFps={...n.a(1e9,r.defaultDuration,3e4),kind:`declared`},i.provenance.nominalFps=`header`,r.frameRate>0&&r.defaultDuration===Math.trunc(1e9/r.frameRate)&&i.warnings.push(`DefaultDuration derived from Video FrameRate ${r.frameRate}`)):i.warnings.push(Q);let o=t.tagDurations.get(r.uid);return o!==void 0&&(i.durationSec=o,i.provenance.durationSec=`header`),i}function infoDurationSec(e){return e.duration*e.timestampScale/1e9}function warnEstimatedFrames(e,t,n){let r=n.durationSec??infoDurationSec(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 warnInfoDuration(e,t,n){let r=infoDurationSec(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 setScannedDuration(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 sampleDensity(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=readHeader(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||!X.has(e.id))break;if(a){let n=e.id===160?readHeader(o,e.dataStart-s,s):e,r=n&&(n.id===163||n.id===161)?parseBlockHeader(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 estimateScan(e,t,n){if(!t){if(!(n>0))return null;let t=e/n>=G;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 estimateWalkMs(e,n,r){let i=Math.min(e,Y,n?.video?Math.ceil(48*n.bytes/n.video):Y);return t.l(r.costModel,Math.ceil(i/r.readAhead.head),i)}function planExactScan(e,n,r){let i=(n?.blocks??0)*r.costModel.perBlockMs,plan=(e,n,a)=>({window:e,reads:n,bytes:a,ms:t.l(r.costModel,n,a)+i}),a=r.readAhead.matroskaScan,o=plan(a,Math.ceil(e/a),e);if(!n)return o;let s=Math.ceil(n.large+n.smallBytes/G),c=plan(G,s,Math.min(e,s*G));return c.ms<o.ms?c:o}const $={newScanState,addBlock};async function loadEstimate(){try{return await Promise.resolve().then(()=>require("./rfps-C-pyKnu8.cjs"))}catch{return`the estimate code did not load`}}async function settle(e,t){try{return await t()}catch(t){return e.reader.checkAbort(),`the estimate failed: ${t instanceof Error?t.message:String(t)}`}}async function exactScan(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 scanSegment(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 findFirstCluster(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 findClusterForward(e,r,Math.min(t.segmentEnd,r+16777216),t.declaredEnd,{step:J});if(i>=0)return i;for(let n of(await cuePositions(e,t)).slice(0,4))if((await e.header(n))?.id===524531317)return n;return null}async function cuePositions(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,q,e.size-n.dataStart);await e.load(n.dataStart,r,r);let i=[];return parseMaster(t,e.buf,n.dataStart-e.base,n.dataStart-e.base+r,b,i),[...new Set(i)].filter(e=>e<t.segmentEnd).sort((e,t)=>e-t)}function pickEvenly(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 tailScan(e,t,n,r,i){let a=Math.max(i.readAhead.tail||0,4096),o=t.segmentEnd,s=-1/0;for(;;){let i=Math.max(r,t.segmentEnd-a);for(let r of i<o?await findLastClusters(e,i,o,t.declaredEnd):[]){let i=newScanState(t,e.size,n);if(await walkCluster(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,K)}}async function probeScan(e,t,n,i,a,o,s){let c=await tailScan(e,t,n,a,o),l=await cuePositions(e,t),u=pickEvenly(l[0]===a||!l.length?l:[a,...l.filter(e=>e>a)],8);if(!l.length){u=[a];let n=t.segmentEnd-a;for(let r=1;r<8;r++){let i=a+Math.floor(r*n/8),o=await findClusterForward(e,i,Math.min(t.segmentEnd,i+1048576),t.declaredEnd,{step:J});o>u[u.length-1]&&u.push(o)}}let d=new Map,f=null,p=0;for(let i of u){let o=newScanState(t,e.size,n);if(await walkCluster(e,o,i,32)){p++,i===a&&(f=o);for(let e of o.tracks.values()){if(e.n<2)continue;let t=d.get(e.track.number)??[];t.push(r.analyzeTimeline({timescale:1e9/e.tickNs,pts:e.pts.subarray(0,e.n),tickQuantized:!0})),d.set(e.track.number,t)}}}s.push(`probe: ${p} cluster(s) sampled via ${l.length?`Cues`:`sync search`}, up to 32 video blocks each`),c||s.push(`probe: no video block found in the tail`),warnInfoDuration(t,c?.maxAnyTicks??-1/0,s),n.forEach((e,n)=>{let r=i[n],a=r.timescale,o=mergeRunStats(a,d.get(e.number)??[]);o.isVfr===null?p>0&&r.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`):fillRates(r,o,`sampled`);let s=f?.tracks.get(e.number),l=s?.n?Math.min(...s.pts.subarray(0,s.n)):null;l!==null&&(r.startSec=l/a,r.provenance.startSec=`sampled`);let u=c?.st.tracks.get(e.number);u?.n&&setScannedDuration(r,(u.maxPts+(u.maxPtsDur>0?u.maxPtsDur:o.medianDelta??0)-(l??0))/a,`sampled`),warnEstimatedFrames(t,e,r)})}function applyExact(e,t){let i=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 a=r.analyzeTimeline({timescale:i,pts:t.pts.subarray(0,t.n),lastDuration:t.maxPtsDur>0?t.maxPtsDur:null,tickQuantized:!0});return e.warnings.push(...a.warnings),setScannedDuration(e,a.durationSum/i,`exact`),fillRates(e,a,`exact`),e.avgFps=t.frames!==t.n&&Number.isSafeInteger(i)&&Number.isSafeInteger(a.durationSum)?n.r(i,t.frames,a.durationSum):a.avgFps,e.startSec=a.firstPts===null?null:a.firstPts/i,e.dominantFps=a.dominantFps,e.provenance.avgFps=e.provenance.startSec=e.provenance.dominantFps=`exact`,!e.nominalFps&&a.nominalFps?(e.nominalFps=a.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)}`),a.duplicateTimestamps&&e.warnings.push(`${a.duplicateTimestamps} duplicate block timestamp(s) excluded from the instantaneous rates`),a.profile}async function analyzeMatroska(t,n){let i=new ByteSource(t,n.readAhead.head),a=await readMatroskaHeader(i),o=e.c(a.docType===`webm`?`webm`:`matroska`),s=o.warnings;o.brand=a.docType,o.scan=`header`,s.push(...a.warnings),a.docType!==`webm`&&a.docType!==`matroska`&&s.push(`unexpected DocType '${a.docType}'`),a.segmentUnknownSize&&s.push(`Segment has an unknown size (live or unfinished recording)`),o.formatDurationSec=a.duration===0?null:Math.trunc(a.duration*a.timestampScale*1e3/1e6)/1e6,o.audioTrackCount=a.tracks.filter(e=>e.type===2).length,a.attachedImages&&s.push(`${a.attachedImages} attached image(s) ignored: ffprobe lists them as attached_pic video streams`);let c=a.tracks.filter(e=>e.type===1);if(!c.length)return s.push(`no video track`),o;o.primaryTrackId=c[0].number,o.videoTracks=c.map(e=>headerTrack(a,e));let l=n.matroskaMode,u=null;if(l!==`header`&&(u=await findFirstCluster(i,a),u===null&&s.push(`no Cluster found: nothing to scan`)),u===null)return c.forEach((e,t)=>warnEstimatedFrames(a,e,o.videoTracks[t])),o;let d=a.segmentEnd-u,f=c[0],p=a.tagDurations.get(f.uid)??infoDurationSec(a),m=p>0&&f.defaultDuration>0?p*1e9/f.defaultDuration:0,h=await sampleDensity(i,c,u,d),g=planExactScan(d,estimateScan(d,h,m),n),_=f.defaultDuration?null:await loadEstimate();if(l===`auto`){let e=typeof _==`object`&&_&&!_.setupUnsupported(a)?estimateWalkMs(d,h,n):0;l=g.ms<=n.exactBudgetMs+e?`exact`:`probe`;let t=e?` plus the ${e.toFixed(0)} ms that probe mode reads for the ffprobe estimate`:``;l===`probe`&&s.push(`exact block scan skipped: predicted ${g.ms.toFixed(0)} ms exceeds the ${n.exactBudgetMs} ms budget${t}`)}let v=o.videoTracks[0],note=e=>{typeof e!=`string`&&(v.avgFpsFfprobe=e.avg,v.rFpsFfprobe=e.r),v.warnings[v.warnings.indexOf(Q)]=typeof e==`string`?`${Z}not reproduced (${e})`:`${Z}estimated like ffprobe from ${e.packets} video packets`};if(l===`exact`){i.window=g.window;let e=newScanState(a,i.size,c,n.maxExpandedSamples);g.window<n.readAhead.matroskaScan&&(e.switchReads=t.reads+2*g.reads+16,e.largeWindow=n.readAhead.matroskaScan);let l=typeof _==`object`&&_?_.attachEstimate(i,a,$,e):_;await exactScan(i,e,u,n),l!==null&&note(typeof l==`function`?await settle(i,l):l),o.scan=`exact`,s.push(...e.warnings),e.truncated&&s.push(`truncated file: the last Cluster or block ends beyond EOF`),e.missingClusterTs&&s.push(`${e.missingClusterTs} block(s) in Clusters without a Timestamp`),warnInfoDuration(a,e.maxAnyTicks,s);for(let[t,n]of c.entries()){let i=o.videoTracks[t];i.rateProfile=await r.rateProfileOf(applyExact(i,e.tracks.get(n.number)))}return o}if(_!==null){let e=newScanState(a,i.size,[]),t=typeof _==`string`?_:_.attachEstimate(i,a,$,e,!0);note(typeof t==`string`?t:await settle(i,()=>scanSegment(i,e,u).then(t)))}return i.window=g.window===4096?G:n.readAhead.head,await probeScan(i,a,c,o.videoTracks,u,n,s),o.scan=`probe`,o}exports.CPU_MS_PER_BLOCK=ee,exports.LARGE_FRAME_BYTES=32768,exports.MAX_CUES_BYTES=q,exports.MAX_TAIL_BYTES=K,exports.PROBE_BLOCKS=32,exports.PROBE_CLUSTERS=8,exports.SMALL_SCAN_WINDOW=G,exports.analyzeMatroska=analyzeMatroska,exports.codecNameOf=codecNameOf,exports.declaredRate=declaredRate,exports.estimateScan=estimateScan,exports.estimateWalkMs=estimateWalkMs,exports.mergeRunStats=mergeRunStats,exports.planExactScan=planExactScan;
@@ -0,0 +1 @@
1
+ const e=require("./guards-Dqpjtkdn.cjs"),t=require("./errors-0oBg1Ai6.cjs"),n=[`avgFps`,`nominalFps`,`minFps`,`maxFps`],r=new Set([`estimated`,`sampled`]),sameRational=(e,t)=>[e.num,e.den,t.num,t.den].every(Number.isSafeInteger)?BigInt(e.num)*BigInt(t.den)===BigInt(t.num)*BigInt(e.den):e.num/e.den===t.num/t.den;function valueOf(e,t){return t===`frames`?e.presentedFrames??e.frames:t===`durationSec`?e.durationSec:e[t]}function equal(e,t,n){let i=valueOf(t,e),a=valueOf(n,e);if(typeof i==`number`&&typeof a==`number`)return e===`durationSec`?Math.abs(i-a)<=1e-6:i===a;let o=i,s=a;return sameRational(o,s)?!0:(r.has(t.provenance[e])||r.has(n.provenance[e]))&&Math.abs(o.value/s.value-1)<=.003}function compareResults(t,r){let i=new Map;for(let[n,r]of Object.entries(t)){let t=r&&!r.error?e.u(r):null;t&&i.set(n,t)}let a=[...i.keys()],o=r===void 0?i.has(`own`)?`own`:a[0]??null:i.has(r)?r:null,s=[...n,`frames`,`durationSec`].map(e=>{let t={};for(let[n,r]of i)t[n]=valueOf(r,e);let n=o===null?null:i.get(o),r=[],a=0;if(n&&valueOf(n,e)!==null)for(let[t,s]of i)t!==o&&valueOf(s,e)!==null&&(a++,equal(e,n,s)||r.push(t));return{field:e,values:t,agree:a===0?null:r.length===0,differ:r}}),c=s.filter(e=>e.agree!==null);return{reference:o,engines:a,fields:s,agree:c.length===0?null:c.every(e=>e.agree)}}const i=2**31-1,delayOf=(e=0)=>e>0&&e<=i?e:0,workerFailed=(e,n,r,i)=>Object.assign(new t.t(`worker-failed`,e,{engine:r,cause:i}),{reason:n});var WorkerPool=class{#e;#t;#n;#r=[];#i=[];#a=1;#o;constructor(e){this.#e=e.create;let t=e.size??1;this.#o=this.#t=Number.isFinite(t)&&t>=1?Math.floor(t):1,this.#n=delayOf(e.idleTimeoutMs??3e4)}get workers(){return this.#r.length}run(e,t={}){let{signal:n}=t;return new Promise((r,i)=>{let onAbort=()=>this.#u(a),a={id:this.#a++,request:e,options:t,resolve:r,reject:i,detach:()=>n?.removeEventListener(`abort`,onAbort)};if(n?.aborted)return this.#c(a,`aborted`,`aborted`,n.reason);n?.addEventListener(`abort`,onAbort),this.#o=this.#t,this.#i.push(a),this.#h()})}dispose(){for(let e of[...this.#r])e.job||this.#d(e)}destroy(){for(let e of[...this.#i.splice(0),...this.#r.map(e=>e.job)])e&&this.#c(e,`aborted`,`pool destroyed`);for(let e of[...this.#r])this.#d(e)}#s(e,n){e.done||(e.done=!0,clearTimeout(e.timer),e.detach(),n instanceof t.t?e.reject(n):e.resolve(n))}#c(e,n,r,i){this.#s(e,new t.t(n,r,{engine:e.options.engine,cause:i}))}#l(e,t,n,r){this.#s(e,workerFailed(t,n,e.options.engine,r))}#u(e){this.#c(e,`aborted`,`aborted`,e.options.signal?.reason);let t=this.#i.indexOf(e);if(t>=0){this.#i.splice(t,1);return}let n=this.#r.find(t=>t.job===e);n&&(n.worker.postMessage({v:1,type:`cancel`,id:e.id}),setTimeout(()=>{n.job===e&&this.#f(n)},1500))}#d(e){clearTimeout(e.idle),e.worker.terminate();let t=this.#r.indexOf(e);t>=0&&this.#r.splice(t,1)}#f(e){this.#d(e),this.#h()}#p(e){e.job=null,this.#h(),!e.job&&this.#n>0&&this.#r.includes(e)&&(e.idle=setTimeout(()=>this.#d(e),this.#n))}#m(){let e=this.#e(),t={worker:e,job:null};return e.onmessage=({data:e})=>{t.answered=!0;let n=t.job;n?.id===e.id&&(e.type===`progress`?n.done||n.options.onProgress?.(e.progress):(e.type===`error`?e.aborted||e.code?this.#c(n,e.aborted?`aborted`:e.code,e.message):this.#l(n,e.message,e.reason??`crash`):this.#s(n,e),this.#p(t)))},e.onerror=e=>{let n=!t.answered,r=t.job;if(this.#d(t),n&&this.#r.length>0)this.#o=this.#r.length,r&&!r.done&&(clearTimeout(r.timer),this.#i.unshift(r));else{let t=n?[`worker script failed to load or parse; the app may have been redeployed`,e.message].filter(Boolean).join(`: `):e.message||`worker failed`;for(let i of n?[r,...this.#i.splice(0)]:[r])i&&this.#l(i,t,n?`load`:`crash`,e)}this.#h()},this.#r.push(t),t}#h(){for(;this.#i.length>0;){let e=this.#r.find(e=>!e.job);if(!e&&this.#r.length<this.#o)try{e=this.#m()}catch(e){this.#l(this.#i.shift(),String(e),`load`,e);continue}if(!e)return;let t=this.#i.shift();clearTimeout(e.idle),e.job=t;let n=delayOf(t.options.timeoutMs);n>0&&(t.timer=setTimeout(()=>{this.#c(t,`timeout`,`timed out after ${n} ms`),e.job===t&&this.#f(e)},n)),e.worker.postMessage({v:1,id:t.id,...t.request})}}};const notRegistered=(e,n=`engine ${e} is not registered`)=>new t.t(`engine-not-registered`,n,{engine:e}),nameOf=e=>typeof File<`u`&&e instanceof File?e.name:``,loadOwnInThread=()=>Promise.resolve().then(()=>require("./runtime-DtgT0xzU.cjs")).then(e=>e.ownEngine);function createProbeCore(e){let{worker:n,engines:r=[],engine:i=`own`,fallback:a=[],workers:o,idleTimeoutMs:s,timeoutMs:c,defaults:l,split:u}=e,d=typeof n==`object`?n:null,f=d?.byContainer,p=n===`inline`||typeof Worker>`u`,m=new Map,h=new Map;for(let e of r)h.has(e.id)||h.set(e.id,e);let g=new AbortController,destroyed=e=>new t.t(`aborted`,`probe destroyed`,{engine:e}),lazy=(e,t)=>new Promise((n,r)=>{let stop=()=>r(destroyed(t));g.signal.addEventListener(`abort`,stop),g.signal.aborted&&stop(),e.then(n,e=>r(workerFailed(String(e),`load`,t,e))).finally(()=>g.signal.removeEventListener(`abort`,stop))}),poolFor=(e,t)=>{let n=m.get(e);return n||m.set(e,n=new WorkerPool({create:t,size:o,idleTimeoutMs:s})),n},poolOf=(e,t)=>({kind:e,pool:()=>poolFor(e,t)}),servedBy=(e,t)=>{let n=e?.[t];return!e||!n?null:p||e.thread!==`worker`?{load:n}:e.createWorker?poolOf(e.id,e.createWorker):e.createWorkers&&u?.(e.id,e.createWorkers,poolFor,lazy,g.signal)||{load:n}},routeOf=e=>{let n=d?.engines.includes(e)?p?{error:new t.t(`unsupported-environment`,`engine ${e} runs in a worker and Worker is not available`,{engine:e})}:e===`own`&&f&&u?.(`custom`,f,poolFor,lazy,g.signal,d.create)||poolOf(`custom`,d.create):null;return n&&`pool`in n?n:(e===`own`?servedBy(h.get(i),`loadOwn`)??servedBy(h.get(`own`),`load`)??servedBy(r.find(e=>e.loadOwn),`loadOwn`)??(p?{load:loadOwnInThread}:null):servedBy(h.get(e),`load`))??n},_=new Map;for(let e of[`own`,...d?.engines??[],...h.keys()]){let t=_.has(e)?null:routeOf(e);t&&_.set(e,t)}if(!_.has(`own`))throw notRegistered(`own`,`own has no route: list it on the custom worker or register a prebuilt engine`);for(let e of[i,...a])if(!_.has(e))throw notRegistered(e);let run=(e,t,n,r,i)=>{let a=_.get(e);if(!a)return Promise.reject(notRegistered(e));if(g.signal.aborted)return Promise.reject(destroyed(e));if(`error`in a)return Promise.reject(a.error);let o=i.timeoutMs??c;if(`pool`in a)return a.pool().run({type:`analyze`,file:t,name:n,engine:e,options:r},{signal:i.signal,timeoutMs:o,onProgress:i.onProgress,engine:e});let s=[i.signal,g.signal];return lazy(Promise.resolve().then(()=>require("./inline-Bx-TQg8f.cjs")),e).then(c=>c.runInline(a.load,t,n,r,{engine:e,signals:s,timeoutMs:o,onProgress:i.onProgress,host:i.host}))},analyze=async(e,t={})=>{let{engine:n=i,fallback:r=a,name:o=nameOf(e),host:s,signal:c,timeoutMs:u,onProgress:d,...f}=t,p=[...new Set([n,...r])],m=p.find(e=>!_.has(e));if(m)throw notRegistered(m);let h={...l,...f},g={host:s,signal:c,timeoutMs:u,onProgress:d},v=p.length===1?await run(n,e,o,h,g):null;return v?.type===`result`?v.result:lazy(Promise.resolve().then(()=>require("./fallback-D9Ak2zFv.cjs")),n).then(t=>t.runChain(run,p,e,o,h,g,v))},v=[..._.keys()];return{engines:v,analyze,tryAnalyze:(e,t)=>analyze(e,t).catch(()=>null),compare:(e,t)=>lazy(Promise.resolve().then(()=>require("./compare-D7RVqlqf.cjs")),null).then(n=>n.compare({engines:v,routes:_,run,defaults:l},e,t)),async prewarm(e={}){if(g.signal.aborted)return;let t=e.containers??[`isobmff`],n=new Map,r=[];for(let a of e.engines??[i]){let e=_.get(a);if(!(!e||`error`in e)){if(`load`in e)r.push(lazy(e.load(),a).then(e=>e.warm?.(t)));else for(let[r,i]of e.warmPools?e.warmPools(t):[[e.pool(),t]]){let[e,t]=n.get(r)??[[],[]];n.set(r,[[...e,a],[...new Set([...t,...i])]])}}}for(let[e,[t,i]]of n)r.push(e.run({type:`warm`,engines:t,containers:i},{timeoutMs:c}));await Promise.allSettled(r)},dispose(){for(let e of m.values())e.dispose()},destroy(){g.abort();for(let e of m.values())e.destroy()}}}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return nameOf}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return compareResults}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return createProbeCore}});
@@ -0,0 +1 @@
1
+ const e=2147483647;function absBig(e){return e<0n?-e:e}function gcdBig(e,t){for(;t!==0n;){let n=e%t;e=t,t=n}return e}function toBig(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 avReduce(t,n,r=e){let i=toBig(t,`num`),a=toBig(n,`den`),o=toBig(r,`max`),s=0n,c=1n,l=1n,u=0n,d=i<0n!=a<0n,f=gcdBig(absBig(i),absBig(a));for(f!==0n&&(i=absBig(i)/f,a=absBig(a)/f),i<=o&&a<=o&&(l=i,u=a,a=0n);a!==0n;){let e=i/a,t=i-a*e,n=e*l+s,r=e*u+c;if(n>o||r>o){if(l!==0n&&(e=(o-s)/l),u!==0n){let t=(o-c)/u;t<e&&(e=t)}a*(2n*e*u+c)>i*u&&(l=e*l+s,u=e*u+c);break}s=l,c=u,l=n,u=r,i=a,a=t}let p=Number(l);return{num:d?-p:p,den:Number(u),exact:a===0n}}function toDecimal(e){return e.den===0?0:e.num/e.den}function toFfprobeString(e){return e?`${e.num}/${e.den}`:`0/0`}function makeRational(e,t){return{num:e,den:t,value:toDecimal({num:e,den:t})}}function reduceRational(t,n,r=e){let i=avReduce(t,n,r);return makeRational(i.num,i.den)}function avgFrameRate(t,n,r){return n<=0||r<=0||t<=0?null:reduceRational(BigInt(t)*BigInt(n),r,e)}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return reduceRational}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return makeRational}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return avReduce}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return toFfprobeString}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return avgFrameRate}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return e}});
@@ -0,0 +1 @@
1
+ function throwIfAborted(e){if(e?.aborted)throw e.reason??new DOMException(`Aborted`,`AbortError`)}const e={head:65536,fragment:1048576,matroskaScan:1048576,tail:262144},t={perReadMs:.8,bytesPerMs:5e5,perBlockMs:2e-4};function mergeDefined(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 resolveOptions(n={}){return{signal:n.signal??null,matroskaMode:n.matroskaMode??`auto`,exactBudgetMs:n.exactBudgetMs??150,readAhead:mergeDefined(e,n.readAhead),costModel:mergeDefined(t,n.costModel),maxExpandedSamples:n.maxExpandedSamples??5e6,onProgress:n.onProgress??null}}function predictReadMs(e,t,n){return t*e.perReadMs+n/e.bytesPerMs}function assertSafeCount(e,t,n=RangeError){if(!Number.isSafeInteger(e)||e<0)throw new n(`${t} must be a non-negative safe integer, got ${e}`)}var BlobReader=class{size;headWindow;maxWindows;signal;#e;#t=[];#n=[];#r=0;#i=0;constructor(e,t={}){assertSafeCount(e.size,`blob size`,TypeError),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,assertSafeCount(this.headWindow,`headWindow`,TypeError)}get reads(){return this.#r}get bytesFetched(){return this.#i}checkAbort(){throwIfAborted(this.signal)}async read(e,t){if(assertSafeCount(e,`offset`),assertSafeCount(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:withErrorCode(`read-failed`,`file read failed: ${e}`)}if(this.checkAbort(),this.#r++,r.byteLength!==n-e)throw withErrorCode(`read-failed`,`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,worker=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)}},i=[];for(let n=0;n<Math.max(1,Math.min(t,e.length));n++)i.push(worker());return await Promise.all(i),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(assertSafeCount(e,`offset`),assertSafeCount(t,`length`),assertSafeCount(n,`readAhead`,TypeError),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}};function u24(e,t){return e.getUint8(t)*65536+e.getUint16(t+1)}function ascii(e,t,n){let r=``;for(let i=0;i<n;i++)r+=String.fromCharCode(e.getUint8(t+i));return r}function fourcc(e,t){return ascii(e,t,4).replace(/[^ -~]/g,`?`)}function withErrorCode(e,t){return Object.assign(Error(t),{errorCode:e})}function whichErrorCode(e,t=`internal`){return e?.errorCode??(e instanceof RangeError?`corrupt`:t)}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return withErrorCode}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return 5e6}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return throwIfAborted}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return whichErrorCode}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return predictReadMs}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return fourcc}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u24}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return BlobReader}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return resolveOptions}});
@@ -0,0 +1 @@
1
+ const e=require("./rational-Dq5Vza-Q.cjs"),t=5e6,n=`V_MPEG4/ISO/AVC`,r=`V_AV1`,stdRate=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;function llrint(e){let t=Math.floor(e),n=e-t;return n>.5||n===.5&&t%2!=0?t+1:t}function gcd(e,t){for(;t;)[e,t]=[t,e%t];return e}const toUs=(e,t)=>Number((BigInt(e)*BigInt(t.num)*1000000n+BigInt(t.den>>1))/BigInt(t.den));function opusSamples(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 rbsp(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,u=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},ue=()=>{let e=0;for(;!u(1);)if(++e>31)throw RangeError();return 2**e-1+u(e)};return{u,ue}}function h264Sps(e){let{u:t,ue:n}=rbsp(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 nalUnits(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 h264Unsupported(e,t){let n=e?(e[4]&3)+1:0,r=e?[]:nalUnits(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 type=e=>e[0]&31,i=r.find(e=>type(e)===7),a=i?h264Sps(i):`no H.264 SPS`;if(typeof a==`string`)return a;let o=[];for(let e of t){let t=nalUnits(e,n).find(e=>type(e)===1||type(e)===5);if(!t)return`no H.264 slice header`;o.push(t)}if(type(o[0])!==5)return`H.264 does not start with an IDR`;let s=r.filter(e=>type(e)===8);if(!s.length)return`no H.264 PPS`;let c=2**a.frameNumBits,l=0,d=NaN,f=-1,p=0,m=null;try{for(let e of s){let{u:t,ue:n}=rbsp(e);if(n(),n(),t(1),t(1)&&!a.pocType)return`H.264 bottom field POC`}for(let e of o){let{u:t,ue:n}=rbsp(e);n(),n(),n();let r=t(a.frameNumBits);if(type(e)===5)n(),l=p=0,d=NaN,m=null;else if(f>=0&&r!==f&&r!==(f+1)%c)return`H.264 frame_num gap`;else r<f&&(p+=c);f=r;let i=2*(p+r)-(e[0]&96?0:1);if(!a.pocType){let n=t(a.pocLsbBits),r=2**a.pocLsbBits;d>=0||(d=n);let o=n<d&&d-n>=r/2?l+r:n>d&&n-d>r/2?l-r:l;i=o+n,e[0]&96&&([l,d]=[o,n])}if(m!==null&&(a.fixedDelay?i<m:i-m!==1&&i-m!==2))return`H.264 POC step ${i-m}`;m=i}}catch{return`bad H.264 PPS or slice header`}return null}function av1TimingInfo(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 codecUnsupported(e,t){let i=e.codecPrivate;if(e.codecId===r){let e=av1TimingInfo(i&&i.length>4?i.subarray(4):t[0]);return e===null?`no AV1 sequence header`:e?`AV1 timing info`:null}return e.codecId===n?h264Unsupported(i,t):null}function setupUnsupported(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`,r,n].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 attachEstimate(r,i,a,o,s=!1){let c=setupUnsupported(i);if(c)return c;let l=new Map;for(let t of i.tracks){let n=e.n(Math.trunc(i.timestampScale*t.trackTimestampScale),1e9,e.t);l.set(t.number,{tb:n,nb:0,cid:0,durs:0,seen:!1,first:null,firstIdx:0,last:null,lastIdx:0})}let d=i.tracks.find(e=>e.type===1),f=l.get(d.number),p=f.tb,m=p.num/p.den,h=d.codecId===n,g=h||p.den>=101*p.num||p.den<5*p.num,_=g?m>5e-4?40:20:0,v=new Float64Array(1596),variance=(e,t)=>{let n=v[2*e*399+t]/b;return v[(2*e+1)*399+t]/b-n*n},y=null,b=0,x=0,S=0,C=0,w=null,T=null,E=null,damage=()=>o.resyncs||o.truncated||o.missingClusterTs,D=[],O=a.newScanState(i,r.size,i.tracks),accept=(e,n,o,s)=>{let c=a.addBlock(O,e,n,o);if(C>=t||f.nb&&b>=_&&[...l.values()].every(e=>e.seen||e.nb>=50))return!1;let d=l.get(c.track.number),g=s.dataStart+Math.clz32(r.buf[s.dataStart-r.base])-20,T=s.dataStart+s.size-g,E=d===f,k=o||Math.floor(c.track.defaultDuration*e.laces/i.timestampScale);if(e.laces>1||c.noPtsFrames?w=`laced or untimed blocks`:!k&&!E?(k=Math.floor(opusSamples(r.buf[g-r.base],T>1?r.buf[g+1-r.base]:0)*d.tb.den/(48e3*d.tb.num)),(!k||T<1)&&(w=`a bad Opus packet`)):!k&&p.num*1e3>p.den&&(k=1),E&&!f.nb&&s.id===163&&!(e.flags&128)&&(w=`no keyframe first`),w)return!1;C+=T;let A=E&&h&&f.nb<7?null:c.pts[c.n-1];if(A!==null&&d.nb>1&&(d.last!==null&&(d.last>=A||d.first!==null&&d.lastIdx>d.firstIdx&&Math.floor((A-d.last)/1e3)>Math.floor((d.last-d.first)/(d.lastIdx-d.firstIdx)))&&(d.first=null),d.first===null&&(d.first=A,d.firstIdx=d.nb),d.last=A,d.lastIdx=d.nb),d.nb>1){let e=toUs(d.cid,d.tb);if(!e&&d.nb>30&&d.first!==null&&d.last!==null&&(e=toUs(d.last-d.first,d.tb)),e>=t)return!1;k>0&&(d.cid+=k,d.durs++)}if(E&&A!==null&&y!==null&&A>y){let e=A*m;for(let t=0;t<399;t++){if(!(v[399+t]<1e10))continue;let n=e*stdRate(t)/12012;for(let e=0;e<2;e++){let r=n-llrint(n+e*.5)+e*.5;v[2*e*399+t]+=r,v[(2*e+1)*399+t]+=r*r}}if(b++,x+=A-y,b%10==0)for(let e=0;e<399;e++)v[399+e]<1e10&&variance(0,e)>.04&&variance(1,e)>.04&&(v[399+e]=v[1197+e]=2e10);b>3&&(S=gcd(S,A-y))}if(E&&A!==null&&(y=A),A!==null&&(d.seen=!0),E&&f.nb<(h?7:1)){let e=Math.min(T,1024);D.push(r.has(g,e)?r.buf.slice(g-r.base,g+e-r.base):[g,e])}return d.nb++,!0};return o.onBlock=(e,t,n,r)=>{if(E===null){try{if(accept(e,t,n,r))return}catch(e){T=[e]}E=damage(),s&&(o.stop=!0)}},async()=>{if(T)throw T[0];if(w)return w;if(!f.nb||(E??damage()))return`damaged first Clusters`;let t=[];for(let e of D)t.push(e instanceof Uint8Array?e:(await r.load(e[0],e[1],e[1]),r.buf.slice(e[0]-r.base,e[0]+e[1]-r.base)));let n=codecUnsupported(d,t);if(n)return n;let i=null,a=null;if(g&&b>15&&S>Math.max(1,Math.floor(p.den/(500*p.num)))&&(i=e.n(p.den,BigInt(p.num)*BigInt(S),e.t)),b>1&&!i&&g){let t=0,n=.01;for(let e=0;e<399;e++){let r=stdRate(e);if(!((f.cid?f.cid*m<11511.5/r:r<12012)||m*x/b<9609.6/r))for(let i=0;i<2;i++){let a=variance(i,e);a<n&&n>1e-9&&(n=a,t=r)}}t&&t/12012<1.01*(p.den/p.num)&&(i=e.n(t,12012,e.t))}if(i&&x&&f.cid<=0&&b>2&&Math.abs(1/(i.num/i.den*m)-x/b)<=1&&(a=i),f.durs&&!a&&f.cid){a=e.n(BigInt(f.durs)*BigInt(p.den),BigInt(f.cid)*BigInt(p.num),6e4);let t=.01,n=0;for(let e=0;e<399;e++){let r=Math.abs(a.num/a.den/(stdRate(e)/12012)-1);r<t&&(t=r,n=stdRate(e))}n&&(a=e.n(n,12012,e.t))}return i??={num:p.den,den:p.num},{avg:a?`${a.num}/${a.den}`:`0/0`,r:`${i.num}/${i.den}`,packets:f.nb}}}exports.attachEstimate=attachEstimate,exports.av1TimingInfo=av1TimingInfo,exports.h264Sps=h264Sps,exports.setupUnsupported=setupUnsupported;
@@ -0,0 +1 @@
1
+ const e=require("./guards-Dqpjtkdn.cjs"),t=require("./reader-DNLR-_tm.cjs"),n=require("./sniff-CXwqOGwh.cjs");function firstReadAhead(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 isAbortError(e){return e?.name===`AbortError`}function errorMessage(e){return e instanceof Error?e.message||e.name:String(e)}async function analyzeWith(r,i,a,o){let s=performance.now(),c=t.u(a);t.d(c.signal);let l={name:i,size:r.size,...e.c(`unknown`),errorCode:null,layout:null,io:{reads:0,bytesRead:0,ms:0},engine:`own`},u=null,d=0,f=!1;try{if(u=new t.t(r,{headWindow:c.readAhead.head,signal:c.signal}),u.size===0)throw t.a(`empty-file`,`not a recognised container: empty file`);let e=await u.bytes(0,Math.min(1024,u.size),firstReadAhead(u.size,c)),i=n.n(e);if(i.kind===`unknown`)throw t.a(`unrecognised`,`not a recognised container: ${i.reason}`);l.container=i.kind===`isobmff`?`mp4`:`matroska`;let a=performance.now();f=!0;let s=await o(i.kind);f=!1,d=performance.now()-a,Object.assign(l,await s(u,c))}catch(e){if(c.signal?.aborted||isAbortError(e))throw e;l.error=errorMessage(e),l.errorCode=t.i(e,f?`load-failed`:`internal`)}return u&&(l.io.reads=u.reads,l.io.bytesRead=u.bytesFetched),l.io.ms=performance.now()-s-d,l}const r={isobmff:async()=>(await Promise.all([Promise.resolve().then(()=>require("./isobmff-B_bb5rS5.cjs")),Promise.resolve().then(()=>require("./stats-D68frkk2.cjs"))]))[0].analyzeIsoBmff,matroska:async()=>(await Promise.all([Promise.resolve().then(()=>require("./matroska-CLoGzfKA.cjs")),Promise.resolve().then(()=>require("./stats-D68frkk2.cjs"))]))[0].analyzeMatroska},i={isobmff:async(e,t)=>(await r.isobmff())(e,t),matroska:async(e,t)=>(await r.matroska())(e,t)};function analyze(e,t,n={},a=i,o=a===i?r:null){return analyzeWith(e,t,n,o?e=>o[e]():e=>a[e])}const a={run:(e,t,n)=>analyze(e,t,n),containers:`any`,warm:async e=>{await Promise.all(e.map(e=>r[e]()))}};exports.ownEngine=a;
@@ -0,0 +1 @@
1
+ const e=require("./stats-D68frkk2.cjs"),t=1+e.RATE_CHANGE_RELATIVE,num=e=>String(+e.toPrecision(4)),span=e=>({t0:e,t1:e,n:0,sum:0,frames:0,ex:0,d:0,kind:`steady`});function join(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}const rateProfile=(n,r,i,a)=>{let o=r,s=e.FREEZE_MIN_SEC*o,rate=e=>o*e.n/e.sum,isLong=e=>e.n>=5&&e.t1-e.t0>=.5*o,c=[],emit=e=>{let t=c[c.length-1];isLong(e)?c.push(e):t?.kind===`short`?join(t,e,!0):c.push({...e,kind:`short`})},l=span(0),u=span(0),d=span(0),f=0,p=0,m=0,h=0,g=0,_=!1,cut=()=>{l.t1=f,_?c.push({...l,kind:`hold`}):emit(l),l=span(f),_=!1,h=g=0},v=Math.min(120,Math.floor(i/2)),y=a/v,b=new Float64Array(v),add=(e,t)=>{l.n+=e,l.sum+=e*t,l.frames+=e,f+=e*t},visit=(t,n)=>{let r=t;if(n<=0)l.frames+=r,m+=r;else{for(let e=f,t=e+r*n,i=Math.floor(e/y);e<t&&i<v;i++){let r=Math.min(t,(i+1)*y);r>e&&(b[i]+=(r-e)/n),e=Math.max(e,r)}for(;r>0;){let t=l.sum/l.n;if(l.n&&n>=Math.max(s,4*t)){cut(),_=!0,add(1,n),r--;continue}if(_&&Math.abs(n-t)>.075*t&&cut(),_=!1,!l.n){add(r,n);return}let i=n-t,a=e.CUSUM_DRIFT*t,o=2*t,c=Math.abs(i)>a,p=c?1:r;if(c&&(i>0?!h||i-a>o:!g)){let e={...l,t1:f,d:n};i>0?u=e:d=e}if(h=Math.max(0,h+p*(i-a)),g=Math.max(0,g-p*(i+a)),add(p,n),r-=p,h>o||g>o){let e=h>o?u:d,t=l.n-e.n-1;t>0&&Math.abs(Math.log(e.d*e.n/e.sum))<Math.abs(Math.log(e.d*t/(l.sum-e.sum-e.d)))&&(e.t1+=e.d,e.n++,e.sum+=e.d,e.frames++),l.t0=e.t1,l.n-=e.n,l.sum-=e.sum,l.frames-=e.frames,emit(e),h=g=0}}}},x=0,S=0;if(n((e,t)=>{e>0&&(p+=e,x&&t!==S&&(visit(x,S),x=0),x+=e,S=t)}),x&&visit(x,S),!(f>0))return null;l.n?cut():c[c.length-1].frames+=l.frames;let C=[],note=(e,t,n,r,i=t.t1-t.t0)=>{C.push({kind:e,atSec:t.t0/o,durationSec:i/o,fromFps:n,toFps:r})},w=[],dist=(e,t)=>e?Math.abs(Math.log(rate(e)/t)):1/0;c.forEach((e,n)=>{let r=w[w.length-1];if(e.kind===`short`||e.kind===`hold`){let i=rate(e),a=c[n+1]?.kind===`steady`?c[n+1]:void 0,o=dist(r,i)<=dist(a,i)?r:a;if(e.kind=isLong(e)?`variable`:`steady`,e.kind===`steady`&&o){let n=rate(o),r=e.sum>=e.n*Math.max(s,4*o.sum/o.n)?`freeze`:i*t<n?`gap`:i>n*t?`burst`:null;r&&note(r,e,n,i),join(o,e,!r);return}}let i=r?rate(e)/rate(r):0;r?.kind===`steady`&&e.kind===`steady`&&i<t&&i*t>1?join(r,e,!0):w.push(e)});let T=w[w.length-1],E=f+T.sum/T.n;T.frames+=i-p,T.t1=E;for(let e=1;e<w.length;e++){let n=w[e-1],r=w[e],i=rate(r)/rate(n);(n.kind===`steady`&&r.kind===`steady`||i>=t||i*t<=1)&&note(`rate-change`,r,rate(n),rate(r),0)}C.sort((e,t)=>e.atSec-t.atSec);let D=w.filter(e=>e.kind===`steady`).map(e=>[rate(e),e.t1-e.t0-e.ex,e.n]).sort((e,t)=>e[0]-t[0]),O=0,k=0,A=0,j=0,M=0;for(let[e,n,r]of D){for(A+=n,j+=r;e>=D[M][0]*t;M++)A-=D[M][1],j-=D[M][2];O=Math.max(O,A),k=Math.max(k,j)}let N=O/E,P=N<.8||k<.8*(p-m)||D.length>1&&D[D.length-1][0]>=D[0][0]*t,F=w.slice(0,3).map(e=>`${e.kind===`variable`?`~`:``}${num(rate(e))} fps for ${num((e.t1-e.t0)/o)} s`);w.length>3&&F.push(`+${w.length-3} more`);let I=``,tag=(e,t)=>{e&&(I+=`${I?`, `:`; `}${e} ${t}${e>1?`s`:``}`)};for(let e of[`freeze`,`gap`,`burst`])tag(C.filter(t=>t.kind===e).length,e);return tag(m,`duplicate timestamp`),{segments:w.slice(0,50).map(e=>({startSec:e.t0/o,endSec:e.t1/o,frames:e.frames,fps:rate(e),kind:e.kind})),moreSegments:Math.max(0,w.length-50),anomalies:C.slice(0,50),moreAnomalies:Math.max(0,C.length-50),buckets:{bucketSec:y/o,fps:Array.from(b,e=>e*o/y)},uneven:P,dominantShare:N,summary:`${P?`Uneven`:I?`Mostly steady`:`Steady`}: ${F.join(`, `)}${I}`}};exports.rateProfile=rateProfile;
@@ -0,0 +1 @@
1
+ const e=new Set([`ftyp`,`moov`,`mdat`,`free`,`skip`,`wide`,`pnot`,`uuid`,`moof`,`styp`,`sidx`]),t=[26,69,223,163],n=[{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 matchAt(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 isPrintableType(e){for(let t=4;t<8;t++){let n=e[t];if(n<32||n>126)return!1}return!0}function looksLikeText(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 describeUnknown(e){for(let t of n)if(matchAt(e,t.bytes,t.offset))return t.label;return e.length>=188&&e[0]===71&&e[188]===71?`MPEG transport stream`:looksLikeText(e)?`text file`:`no known signature`}function sniff(n){if(n.length===0)return{kind:`unknown`,reason:`empty file`};if(matchAt(n,t,0))return{kind:`matroska`,reason:`EBML header 1A45DFA3`};if(n.length>=8&&isPrintableType(n)){let t=String.fromCharCode(n[4],n[5],n[6],n[7]);if(e.has(t)){let e=n[0]*16777216+n[1]*65536+n[2]*256+n[3];if(e===0)return{kind:`isobmff`,reason:`top-level '${t}' box running to end of file`};if(e>=8)return{kind:`isobmff`,reason:`top-level '${t}' box`};if(e===1){if(n.length<16)return{kind:`unknown`,reason:`'${t}' box with a truncated 64-bit size`};let e=0;for(let t=8;t<16;t++)e=e*256+n[t];if(e>=16)return{kind:`isobmff`,reason:`top-level '${t}' box with 64-bit size`}}return{kind:`unknown`,reason:`'${t}' box with invalid size ${e}`}}}return n.length<8?{kind:`unknown`,reason:`too small (${n.length} bytes)`}:{kind:`unknown`,reason:describeUnknown(n)}}async function containerFamily(e){let{kind:t}=sniff(new Uint8Array(await e.slice(0,Math.min(1024,e.size)).arrayBuffer()));return t===`unknown`?null:t}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return sniff}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return containerFamily}});
@@ -0,0 +1 @@
1
+ require("./reader-DNLR-_tm.cjs");const e=require("./rational-Dq5Vza-Q.cjs"),t=.001,n=.005,r=(()=>{let t=[];for(let n of[24,30,48,60,120,240])t.push(e.i(n*1e3,1001));for(let n=1;n<=240;n++)t.push(e.i(n,1));return t})();function snapToStandardRate(e,n=t){if(!(e>0))return null;let i=null,a=1/0;for(let t of r){let n=Math.abs(e-t.value)/t.value;n<a&&(a=n,i=t)}return a<=n?i:null}function msGridTicks(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 vfrTolerance(e,t,r){return Math.max(1,Math.round(n*e),msGridTicks(t,r))}function reorderDepthFromCts(e,t,n){return!(t>e)||!(n>0)?0:Math.min(16,Math.ceil((t-e)/n))}function nanosecondTick(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 rateFromTicks(t,n){let r=nanosecondTick(t);return r!==null&&n>0&&Number.isSafeInteger(r*n)?e.a(1e9,r*n,2**53-1):ratioOf(t,n,2**53-1)}function analyzeTimeline(e){let t=[],n=normalizeTimescale(e.timescale,t);return`segments`in e?segmentStats(e,n,t):ptsStats(e,n,t)}function durationView(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 ctsView(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 ratioOf(t,n,r=e.t){if(!(t>0)||!(n>0))return null;if(Number.isSafeInteger(t)&&Number.isSafeInteger(n))return e.a(t,n,r);let i=1e6,a=Math.round(t*i),o=Math.round(n*i);return Number.isSafeInteger(a)&&Number.isSafeInteger(o)?e.a(a,o,r):e.i(t/n,1)}function averageRate(t,n,r){if(!(n>0)||!(r>0))return null;let i=nanosecondTick(t);return i!==null&&Number.isSafeInteger(n)&&Number.isSafeInteger(r)?e.a(BigInt(n)*1000000000n,BigInt(i)*BigInt(r),e.t):Number.isSafeInteger(t)&&Number.isSafeInteger(n)&&Number.isSafeInteger(r)?e.a(BigInt(t)*BigInt(n),r,e.t):ratioOf(t*n,r)}function normalizeTimescale(e,t){return e>0&&Number.isFinite(e)?e:(t.push(`invalid timescale ${e}, using 1`),1)}function windowOf(e){return e?{ws:e.start,we:e.end>e.start?e.end:1/0}:{ws:-1/0,we:1/0}}function emptyStats(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,medianFrameInterval: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 profileJob(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 warnHeldLastFrame(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 applyPresentedAverage(e,t){if(warnHeldLastFrame(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=averageRate(e.timescale,e.presentedFrames,e.lastPts-e.firstPts+n)}function deltaAt(e,t){let n=0;for(let[r,i]of durationRuns(e)){if(t<n+r)return i;n+=r}return 0}async function loadRateProfile(){try{let{rateProfile:e}=await Promise.resolve().then(()=>require("./segments-i-hPN7H3.cjs"));return e}catch{return null}}async function rateProfileOf(e){let t=e&&await loadRateProfile();return t?e(t):null}function keptDeltas(e,t){return e-t>=2?e-t:e}function applyHistogram(t,r,i){let a=t.timescale,o=[...r.keys()].sort((e,t)=>e-t),s=o.map(e=>[e,r.get(e)??0]),c=0,l=0;for(let[e,t]of s)c+=t,l+=e*t;if(t.histogram=s,t.distinctDeltas=o.length,c===0)return;let u=0,d=o[0];for(let[e,t]of s)if(u+=t,u*2>=c){d=e;break}let f=o[0],p=0;for(let[e,t]of s)t>p&&(f=e,p=t);let m=msGridTicks(a,o),h=Math.max(1,Math.round(n*d),m),g=0;for(let[e,t]of s)Math.abs(e-d)>h&&(g+=t);let _=o[0],v=o[o.length-1],y=c>=2&&g>0;t.minDelta=_,t.maxDelta=v,t.medianDelta=d;let b=rateFromTicks(a,d);if(t.medianFrameInterval=b&&e.i(b.den,b.num),t.meanDelta=l/c,t.tolerance=h,t.minFps=rateFromTicks(a,v),t.maxFps=rateFromTicks(a,_),t.isVfr=y,t.vfrRatio=g/c,o.length===1){let e=rateFromTicks(a,_);e&&(t.nominalFps={...e,kind:`exact`})}else if(y&&p*2>=c){let e=rateFromTicks(a,f);e&&(t.dominantFps={rate:e,share:p/c})}t.timestampsQuantized=(i||m>0)&&!y&&o.length>1}function applySnappedNominal(e){if(e.nominalFps||e.isVfr!==!1||e.distinctDeltas<2||!e.avgFps)return;let t=snapToStandardRate(e.meanDelta?e.timescale/e.meanDelta:e.avgFps.value);t&&(e.nominalFps={...t,kind:`snapped`})}function scanSegments(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,seeCts=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)},r=0;for(let n=0;n<e.length;n++){let i=e[n];i.baseDts!==void 0&&i.baseDts!==null&&(n===0?t.startDts=i.baseDts:i.baseDts!==r&&t.discontinuities++,r=i.baseDts);let a=durationView(i.durations),o=0;for(let e=0;e<a.n;e++){let n=a.counts?a.counts[e]:1;if(n<=0)continue;let i=a.values[e];o+=n,t.d+=n*i,r+=n*i,i<0&&(t.negativeDurations=!0),t.firstDelta===0&&i>0&&(t.firstDelta=i)}t.n+=o;let s=ctsView(i.cts),c=0,l=0;if(s){for(let e=0;e<s.n;e++){let t=s.counts?s.counts[e]:1;if(t<=0)continue;l+=t;let n=Math.min(t,o-c);n<=0||(c+=n,seeCts(s.values[e]))}l!==o&&t.ctsMismatch++}c<o&&seeCts(0)}return n||(t.ctsMin=0,t.ctsMax=0),t}function*durationRuns(e){for(let t of e){let e=durationView(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 countPtsBelow(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 durationRuns(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 ptsAt(e,t,n){let r=t,i=0;for(let[t,a]of durationRuns(e)){if(n<i+t)return r+(n-i)*a;i+=t,r+=t*a}return r}function segmentStats(t,n,r){let i=t.segments,a=scanSegments(i);a.ctsMismatch>0&&r.push(`composition offsets do not match the sample count in ${a.ctsMismatch} segment(s)`),a.discontinuities>0&&r.push(`decode timestamp discontinuities: ${a.discontinuities}`),a.negativeDurations&&r.push(`negative sample durations`),Number.isSafeInteger(a.d)||r.push(`duration sum exceeds 2^53-1`);let o=emptyStats(n,r);if(o.sampleCount=a.n,o.durationSum=a.d,o.discontinuities=a.discontinuities,o.avgFps=averageRate(n,a.n,a.d),o.avgFpsString=e.o(o.avgFps),a.n===0)return o.presentedFrames=0,o;let s=t.reorderDepth??reorderDepthFromCts(a.ctsMin,a.ctsMax,a.firstDelta);o.reorderDepth=s;let c=1+s,{ws:l,we:u}=windowOf(t.editWindow),d=t.tickQuantized??!1;if(!t.forceExpand&&a.constantCts&&a.discontinuities===0&&!a.negativeDurations){o.fastPath=!0;let e=a.startDts+a.ctsValue,t=countPtsBelow(i,e,l,a.n),n=Math.max(t,countPtsBelow(i,e,u,a.n));if(o.presentedFrames=n-t,n===t)return o;let r=ptsAt(i,e,t),s=ptsAt(i,e,n-1);o.firstPts=r,o.lastPts=s;let f=n-t-1,p=keptDeltas(f,c),m=new Map,h=0,g=1/0,_=0;for(let[e,n]of durationRuns(i)){if(h>=t+f)break;let r=Math.max(h,t),i=Math.min(h+e,t+f);if(i>r){if(n===0)o.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)),o.deltaCount+=i-r)}}h+=e}return o.excludedTailDeltas=f-p,applyHistogram(o,m,d),applySnappedNominal(o),applyPresentedAverage(o,deltaAt(i,n-1)),o.profile=profileJob(o,g,_,e=>{let n=0;for(let[r,a]of durationRuns(i)){if(n>=t+f)break;let i=Math.max(n,t),o=Math.min(n+r,t+f);o>i&&e(o-i,a),n+=r}},n-t,s-r),o}let f=t.maxExpandedSamples??5e6;if(a.n>f)return r.push(`per-sample analysis skipped: ${a.n} samples exceed the limit of ${f}`),o;let p=new Float64Array(a.n),m=0,h=0;for(let e of i){e.baseDts!==void 0&&e.baseDts!==null&&(h=e.baseDts);let t=m,n=durationView(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++)p[m++]=h,h+=r}let r=ctsView(e.cts);if(r){let e=t;for(let t=0;t<r.n&&e<m;t++){let n=r.counts?r.counts[t]:1,i=r.values[t];for(let t=0;t<n&&e<m;t++)p[e++]+=i}}}let g=-1;for(let e=0;e<p.length;e++){let t=p[e];t>=l&&t<u&&(g<0||t>=p[g])&&(g=e)}let _=g>=0?deltaAt(i,g):0;return histogramStage(o,presentSorted(p,l,u),c,d),applyPresentedAverage(o,_),applySnappedNominal(o),o}function presentSorted(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 histogramStage(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=keptDeltas(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,applyHistogram(e,s,r),e.profile=profileJob(e,c,l,e=>{for(let n=1;n<=a;n++)e(1,t[n]-t[n-1])},i,t[a]-t[0])}function reorderLag(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 ptsStats(t,n,r){let i=t.pts,a=i.length,o=emptyStats(n,r);if(o.sampleCount=a,a===0)return o.presentedFrames=0,o;let s=1/0,c=-1/0;for(let e=0;e<a;e++){let t=i[e];t<s&&(s=t),t>c&&(c=t)}let{ws:l,we:u}=windowOf(t.editWindow),d=presentSorted(Float64Array.from(i),l,u),f=t.reorderDepth;if(f===void 0){let e=0;for(let t=1;t<d.length;t++){let n=d[t]-d[t-1];if(n>0){e=n;break}}f=t.ctsRange?reorderDepthFromCts(t.ctsRange.min,t.ctsRange.max,e):reorderDepthFromCts(0,reorderLag(i),e)}o.reorderDepth=f,histogramStage(o,d,1+f,t.tickQuantized??!1),warnHeldLastFrame(o,t.lastDuration);let p=t.lastDuration??o.medianDelta??0;return o.durationSum=c-s+p,o.avgFps=averageRate(n,a,o.durationSum),o.avgFpsString=e.o(o.avgFps),o.presentedAvgFps=o.avgFps,applySnappedNominal(o),o}exports.CUSUM_DRIFT=.075,exports.FREEZE_FACTOR=4,exports.FREEZE_MIN_SEC=.5,exports.MAX_REORDER_DEPTH=16,exports.RATE_CHANGE_RELATIVE=.15,exports.SNAP_RELATIVE_TOLERANCE=t,exports.VFR_RELATIVE_TOLERANCE=n,exports.analyzeTimeline=analyzeTimeline,exports.msGridTicks=msGridTicks,exports.rateFromTicks=rateFromTicks,exports.rateProfileOf=rateProfileOf,exports.reorderDepthFromCts=reorderDepthFromCts,exports.snapToStandardRate=snapToStandardRate,exports.vfrTolerance=vfrTolerance;
@@ -0,0 +1,96 @@
1
+ import type { Agreement } from '../api/agreement.cjs';
2
+ import type { ProbeError } from '../api/errors.cjs';
3
+ import type { AnalyzeProgress, EngineId, FileResult } from '../core/types.cjs';
4
+ import type { MediabunnyNative, Mp4boxNative, RvfcDetails } from '../engines/types.cjs';
5
+ import type { ContainerFamily, EngineDescriptor, WorkerEngineId } from '../plugins/types.cjs';
6
+ import type { WireOptions } from '../worker/protocol.cjs';
7
+ export type IdOf<E> = E extends EngineDescriptor<infer I> ? I : never;
8
+ export interface BaseOptions<Id extends EngineId> {
9
+ engine?: Id;
10
+ fallback?: readonly Id[];
11
+ workers?: number;
12
+ idleTimeoutMs?: number;
13
+ timeoutMs?: number;
14
+ defaults?: WireOptions;
15
+ }
16
+ export interface ProbeOptions<E extends readonly EngineDescriptor[] = []> extends BaseOptions<NoInfer<'own' | IdOf<E[number]>>> {
17
+ engines?: E;
18
+ worker?: 'auto' | 'inline';
19
+ }
20
+ export interface CustomWorker<W extends WorkerEngineId> {
21
+ create: () => Worker;
22
+ engines: readonly W[];
23
+ byContainer?: Readonly<Partial<Record<ContainerFamily, () => Worker>>>;
24
+ }
25
+ export interface ClientOptions<E extends readonly EngineDescriptor[] = [], W extends WorkerEngineId = never> extends BaseOptions<NoInfer<W | IdOf<E[number]> | 'own'>> {
26
+ worker: CustomWorker<W> | 'inline';
27
+ engines?: E;
28
+ }
29
+ export interface CallOptions<Id extends EngineId> extends WireOptions {
30
+ engine?: Id;
31
+ fallback?: readonly Id[];
32
+ name?: string;
33
+ host?: HTMLElement;
34
+ signal?: AbortSignal;
35
+ timeoutMs?: number;
36
+ onProgress?: (progress: AnalyzeProgress) => void;
37
+ }
38
+ export interface Attempt {
39
+ engine: EngineId;
40
+ error: string;
41
+ }
42
+ export type ProbeResult = FileResult & {
43
+ mp4box?: Mp4boxNative;
44
+ mediabunny?: MediabunnyNative;
45
+ rvfc?: RvfcDetails;
46
+ attempts?: readonly Attempt[];
47
+ };
48
+ export interface PrewarmOptions<Id extends EngineId> {
49
+ engines?: readonly Id[];
50
+ containers?: readonly ContainerFamily[];
51
+ }
52
+ export interface CompareOptions<K extends EngineId> {
53
+ engines?: readonly K[];
54
+ reference?: K;
55
+ signal?: AbortSignal;
56
+ timeoutMs?: number;
57
+ onProgress?: (progress: AnalyzeProgress & {
58
+ engine: K;
59
+ }) => void;
60
+ }
61
+ export type EngineOutcome = {
62
+ status: 'ok';
63
+ result: ProbeResult;
64
+ ms: number;
65
+ } | {
66
+ status: 'failed';
67
+ result: ProbeResult;
68
+ error: string;
69
+ ms: number;
70
+ } | {
71
+ status: 'skipped';
72
+ reason: 'unsupported-container' | 'unsupported-environment';
73
+ } | {
74
+ status: 'timeout' | 'crashed';
75
+ error: ProbeError;
76
+ };
77
+ export interface CompareResult<K extends EngineId> {
78
+ name: string;
79
+ size: number;
80
+ reference: K | null;
81
+ outcomes: Partial<Record<K, EngineOutcome>>;
82
+ agreement: Agreement<K>;
83
+ }
84
+ export interface Probe<Id extends EngineId = 'own'> {
85
+ readonly engines: readonly Id[];
86
+ analyze(file: Blob, options?: CallOptions<Id>): Promise<ProbeResult>;
87
+ tryAnalyze(file: Blob, options?: CallOptions<Id>): Promise<ProbeResult | null>;
88
+ compare<K extends Id>(file: Blob, options?: CompareOptions<K>): Promise<CompareResult<K>>;
89
+ prewarm(options?: PrewarmOptions<Id>): Promise<void>;
90
+ dispose(): void;
91
+ destroy(): void;
92
+ }
93
+ export type LazyProbe<Id extends EngineId> = Probe<Id> & {
94
+ readonly loaded: boolean;
95
+ load(): Promise<Probe<Id>>;
96
+ };
@@ -0,0 +1,47 @@
1
+ import type { FileErrorCode } from './types.cjs';
2
+ export interface BlobSlice {
3
+ arrayBuffer(): Promise<ArrayBuffer>;
4
+ }
5
+ export interface BlobLike {
6
+ readonly size: number;
7
+ slice(start?: number, end?: number): BlobSlice;
8
+ }
9
+ export interface BlobReaderOptions {
10
+ headWindow?: number;
11
+ maxWindows?: number;
12
+ signal?: AbortSignal | null;
13
+ }
14
+ export declare const DEFAULT_HEAD_WINDOW: number;
15
+ export declare const DEFAULT_MAX_WINDOWS = 4;
16
+ export declare const MAX_SAFE_OFFSET: number;
17
+ export declare function toSafeNumber(value: bigint, what?: string): number;
18
+ export declare class BlobReader {
19
+ #private;
20
+ readonly size: number;
21
+ readonly headWindow: number;
22
+ readonly maxWindows: number;
23
+ readonly signal: AbortSignal | null;
24
+ constructor(source: BlobLike, options?: BlobReaderOptions);
25
+ get reads(): number;
26
+ get bytesFetched(): number;
27
+ checkAbort(): void;
28
+ read(offset: number, length: number): Promise<Uint8Array>;
29
+ readMany(ranges: ReadonlyArray<readonly [offset: number, length: number]>, concurrency?: number): Promise<Uint8Array[]>;
30
+ peek(offset: number, length: number): DataView | null;
31
+ view(offset: number, length: number, readAhead?: number): Promise<DataView>;
32
+ bytes(offset: number, length: number, readAhead?: number): Promise<Uint8Array>;
33
+ }
34
+ export declare function u8(dv: DataView, p: number): number;
35
+ export declare function u16(dv: DataView, p: number): number;
36
+ export declare function i16(dv: DataView, p: number): number;
37
+ export declare function u24(dv: DataView, p: number): number;
38
+ export declare function u32(dv: DataView, p: number): number;
39
+ export declare function i32(dv: DataView, p: number): number;
40
+ export declare function u64(dv: DataView, p: number): number;
41
+ export declare function i64(dv: DataView, p: number): number;
42
+ export declare function u64Big(dv: DataView, p: number): bigint;
43
+ export declare function fixed16_16(dv: DataView, p: number): number;
44
+ export declare function ascii(dv: DataView, p: number, length: number): string;
45
+ export declare function fourcc(dv: DataView, p: number): string;
46
+ export declare function withErrorCode(code: FileErrorCode, message: string): Error;
47
+ export declare function whichErrorCode(e: unknown, fallback?: FileErrorCode): FileErrorCode;
@@ -0,0 +1,149 @@
1
+ import type { BlobReader } from './reader.cjs';
2
+ export type Provenance = 'header' | 'exact' | 'sampled' | 'estimated' | 'computed';
3
+ export interface Rational {
4
+ num: number;
5
+ den: number;
6
+ value: number;
7
+ }
8
+ export type NominalKind = 'exact' | 'snapped' | 'declared';
9
+ export interface NominalFps extends Rational {
10
+ kind: NominalKind;
11
+ }
12
+ export interface DominantFps {
13
+ rate: Rational;
14
+ share: number;
15
+ }
16
+ export type ContainerKind = 'mp4' | 'mov' | 'webm' | 'matroska' | 'unknown';
17
+ export type EngineId = 'own' | 'mediabunny' | 'mp4box' | 'rvfc';
18
+ export type MatroskaMode = 'header' | 'probe' | 'exact' | 'auto';
19
+ export type ScanDepth = 'header' | 'probe' | 'exact';
20
+ export type TrackField = 'codec' | 'dimensions' | 'rotation' | 'frames' | 'presentedFrames' | 'durationSec' | 'startSec' | 'avgFps' | 'nominalFps' | 'dominantFps' | 'minFps' | 'maxFps' | 'isVfr' | 'duplicateTimestamps' | 'medianFrameInterval';
21
+ export type RateSegmentKind = 'steady' | 'variable';
22
+ export interface RateSegment {
23
+ startSec: number;
24
+ endSec: number;
25
+ frames: number;
26
+ fps: number;
27
+ kind: RateSegmentKind;
28
+ }
29
+ export type RateAnomalyKind = 'rate-change' | 'freeze' | 'burst' | 'gap';
30
+ export interface RateAnomaly {
31
+ kind: RateAnomalyKind;
32
+ atSec: number;
33
+ durationSec: number;
34
+ fromFps: number;
35
+ toFps: number;
36
+ }
37
+ export interface RateBuckets {
38
+ bucketSec: number;
39
+ fps: number[];
40
+ }
41
+ export interface RateProfile {
42
+ segments: RateSegment[];
43
+ moreSegments: number;
44
+ anomalies: RateAnomaly[];
45
+ moreAnomalies: number;
46
+ buckets: RateBuckets;
47
+ uneven: boolean;
48
+ dominantShare: number;
49
+ summary: string;
50
+ }
51
+ export interface VideoTrackResult {
52
+ trackId: number;
53
+ fourccOrCodecId: string;
54
+ codecName: string;
55
+ width: number;
56
+ height: number;
57
+ rotation: number;
58
+ timescale: number;
59
+ frames: number | null;
60
+ presentedFrames: number | null;
61
+ durationSec: number | null;
62
+ startSec: number | null;
63
+ avgFps: Rational | null;
64
+ avgFpsFfprobe: string | null;
65
+ rFpsFfprobe: string | null;
66
+ nominalFps: NominalFps | null;
67
+ dominantFps: DominantFps | null;
68
+ minFps: Rational | null;
69
+ maxFps: Rational | null;
70
+ isVfr: boolean | null;
71
+ vfrRatio: number;
72
+ distinctDeltas: number;
73
+ duplicateTimestamps: number;
74
+ timestampsQuantized: boolean;
75
+ isStill: boolean;
76
+ rateProfile?: RateProfile | null;
77
+ medianFrameInterval?: Rational | null;
78
+ enabled?: boolean;
79
+ provenance: Partial<Record<TrackField, Provenance>>;
80
+ warnings: string[];
81
+ }
82
+ export interface IoStats {
83
+ reads: number;
84
+ bytesRead: number;
85
+ ms: number;
86
+ }
87
+ export type FileErrorCode = 'empty-file' | 'unrecognised' | 'unsupported-container' | 'unsupported' | 'too-large' | 'no-header' | 'truncated' | 'corrupt' | 'no-duration' | 'byte-limit' | 'read-limit' | 'time-limit' | 'structure-limit' | 'read-failed' | 'load-failed' | 'engine-failed' | 'internal';
88
+ export type LayoutKind = 'faststart' | 'moov-at-end' | 'fragmented';
89
+ export interface ContainerLayout {
90
+ kind: LayoutKind;
91
+ moovOffset: number | null;
92
+ moovSize: number | null;
93
+ sidx: boolean;
94
+ emptyMoov: boolean;
95
+ }
96
+ export type WarningCode = 'invalid-timescale' | 'truncated-mdat' | 'truncated-box' | 'trailing-data' | 'fragment-index-unread' | 'duration-unresolved' | 'fragments-ignored' | 'structure-limit';
97
+ export interface FileResult {
98
+ name: string;
99
+ size: number;
100
+ container: ContainerKind;
101
+ brand: string | null;
102
+ formatDurationSec: number | null;
103
+ scan: ScanDepth | null;
104
+ videoTracks: VideoTrackResult[];
105
+ audioTrackCount: number;
106
+ primaryTrackId: number | null;
107
+ error: string | null;
108
+ errorCode?: FileErrorCode | null;
109
+ layout?: ContainerLayout | null;
110
+ warnings: string[];
111
+ io: IoStats;
112
+ engine: EngineId;
113
+ }
114
+ export type ContainerAnalysis = Omit<FileResult, 'name' | 'size' | 'io' | 'engine'>;
115
+ export interface ReadAheadSizes {
116
+ head: number;
117
+ fragment: number;
118
+ matroskaScan: number;
119
+ tail: number;
120
+ }
121
+ export interface CostModel {
122
+ perReadMs: number;
123
+ bytesPerMs: number;
124
+ perBlockMs: number;
125
+ }
126
+ export interface AnalyzeProgress {
127
+ phase: string;
128
+ done: number;
129
+ total: number;
130
+ }
131
+ export interface AnalyzeOptions {
132
+ signal?: AbortSignal | null;
133
+ matroskaMode?: MatroskaMode;
134
+ exactBudgetMs?: number;
135
+ readAhead?: Partial<ReadAheadSizes>;
136
+ costModel?: Partial<CostModel>;
137
+ maxExpandedSamples?: number;
138
+ onProgress?: ((progress: AnalyzeProgress) => void) | null;
139
+ }
140
+ export interface ResolvedAnalyzeOptions {
141
+ signal: AbortSignal | null;
142
+ matroskaMode: MatroskaMode;
143
+ exactBudgetMs: number;
144
+ readAhead: ReadAheadSizes;
145
+ costModel: CostModel;
146
+ maxExpandedSamples: number;
147
+ onProgress: ((progress: AnalyzeProgress) => void) | null;
148
+ }
149
+ export type ContainerAnalyzer = (reader: BlobReader, opts: ResolvedAnalyzeOptions) => Promise<ContainerAnalysis>;
@@ -0,0 +1,69 @@
1
+ import type { FileResult } from '../core/types.cjs';
2
+ export interface Mp4boxTrackNative {
3
+ trackId: number;
4
+ sampleCount: number;
5
+ sttsLastDelta: number | null;
6
+ lastSampleDuration: number | null;
7
+ lastDurationOverridden: boolean;
8
+ fpsFromSampleDurations: number | null;
9
+ fpsFromMdhdDuration: number | null;
10
+ fpsFromMovieDuration: number | null;
11
+ }
12
+ export interface Mp4boxNative {
13
+ version: string;
14
+ fedBuffers: number;
15
+ fedBytes: number;
16
+ moofsFed: number;
17
+ tracks: Mp4boxTrackNative[];
18
+ }
19
+ export type Mp4boxResult = FileResult & {
20
+ mp4box?: Mp4boxNative;
21
+ };
22
+ export interface MediabunnyTrackNative {
23
+ trackId: number;
24
+ packetCount: number;
25
+ averagePacketRate: number | null;
26
+ nativeCallSkipped: boolean;
27
+ timeResolution: number;
28
+ fpsFromTimestamps: number | null;
29
+ }
30
+ export interface MediabunnyNative {
31
+ version: string;
32
+ formatName: string;
33
+ tracks: MediabunnyTrackNative[];
34
+ nativeStatsMs: number;
35
+ }
36
+ export type MediabunnyResult = FileResult & {
37
+ mediabunny?: MediabunnyNative;
38
+ };
39
+ export interface RvfcPass {
40
+ rate: number;
41
+ callbacks: number;
42
+ fps: number;
43
+ avg: number;
44
+ pairs: number;
45
+ spread: number;
46
+ lo: number;
47
+ hi: number;
48
+ }
49
+ export type RvfcConfidence = 'high' | 'medium' | 'low';
50
+ export interface RvfcDetails {
51
+ displayHz: number;
52
+ rate: number;
53
+ passes: RvfcPass[];
54
+ confidence: RvfcConfidence;
55
+ flags: string[];
56
+ }
57
+ export interface RvfcOptions {
58
+ host: HTMLElement;
59
+ name?: string;
60
+ signal?: AbortSignal;
61
+ onProgress?: (p: {
62
+ phase: string;
63
+ done: number;
64
+ total: number;
65
+ }) => void;
66
+ }
67
+ export type RvfcResult = FileResult & {
68
+ rvfc?: RvfcDetails;
69
+ };
@@ -0,0 +1,25 @@
1
+ import { type BlobLike } from '../core/reader.cjs';
2
+ import type { FileResult, IoStats } from '../core/types.cjs';
3
+ import { type HeaderLimits } from './limits.cjs';
4
+ export { errorClass, errorCodeOf, warningCodeOf, warningCodesOf, type ErrorClass } from '../api/codes.cjs';
5
+ export { isAbortError, isTimeoutError } from '../api/guards.cjs';
6
+ export { HEADER_DEFAULT_LIMITS, type HeaderLimits } from './limits.cjs';
7
+ export type { BlobLike, BlobSlice } from '../core/reader.cjs';
8
+ export type * from '../core/types.cjs';
9
+ export type FragmentedDuration = 'header' | 'index';
10
+ export interface HeaderOptions {
11
+ name?: string;
12
+ signal?: AbortSignal | null;
13
+ limits?: HeaderLimits;
14
+ readAhead?: {
15
+ head?: number;
16
+ tail?: number;
17
+ };
18
+ fragmentedDuration?: FragmentedDuration;
19
+ }
20
+ export type HeaderResult = FileResult & {
21
+ io: IoStats & {
22
+ bytesRequested: number;
23
+ };
24
+ };
25
+ export declare function analyzeHeader(source: Blob | BlobLike, options?: HeaderOptions): Promise<HeaderResult>;
@@ -0,0 +1,25 @@
1
+ import type { BlobLike, BlobSlice } from '../core/reader.cjs';
2
+ export interface HeaderLimits {
3
+ maxBytes?: number;
4
+ maxReads?: number;
5
+ maxMs?: number;
6
+ maxTracks?: number;
7
+ maxTopLevelBoxes?: number;
8
+ }
9
+ export declare const HEADER_DEFAULT_LIMITS: Readonly<Required<HeaderLimits>>;
10
+ export type LimitCode = 'byte-limit' | 'read-limit' | 'time-limit' | 'structure-limit';
11
+ export declare class LimitError extends Error {
12
+ readonly errorCode: LimitCode;
13
+ constructor(code: LimitCode, message: string);
14
+ }
15
+ export declare class LimitedSource implements BlobLike {
16
+ #private;
17
+ readonly size: number;
18
+ constructor(inner: BlobLike, size: number, limits: Required<Pick<HeaderLimits, 'maxBytes' | 'maxReads' | 'maxMs'>>, caller: AbortSignal | null);
19
+ get bytesLeft(): number;
20
+ get bytesRequested(): number;
21
+ checkTime(): void;
22
+ take(): LimitError | null;
23
+ slice(start?: number, end?: number): BlobSlice;
24
+ dispose(): void;
25
+ }