@basmilius/apple-audio-source 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ import{createRequire as e}from"node:module";var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),c=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;l<u;l++)d=c[l],!o.call(e,d)&&d!==a&&n(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},l=(e,r,i)=>(i=e==null?{}:t(a(e)),c(r||!e||!e.__esModule?n(i,`default`,{value:e,enumerable:!0}):i,e)),u=e(import.meta.url);export{u as n,l as r,s as t};
@@ -0,0 +1,3 @@
1
+ const e=Symbol,t=(()=>{let e=`left`,t=`center`,n=`right`;return[``,`front `,`side `,`rear `].map(r=>[[e,n],[e,n,t],[e,t,n],[t,e,n],[t]].flatMap(e=>e.map(e=>r+e).join(`, `)))})(),n=`monophonic (mono)`,r=`stereo`,i=`surround`,a=(e,...t)=>`${[n,r,`linear ${i}`,`quadraphonic`,`5.0 ${i}`,`5.1 ${i}`,`6.1 ${i}`,`7.1 ${i}`][e-1]} (${t.join(`, `)})`,o=[n,a(2,t[0][0]),a(3,t[0][2]),a(4,t[1][0],t[3][0]),a(5,t[1][2],t[3][0]),a(6,t[1][2],t[3][0],`LFE`),a(7,t[1][2],t[2][0],t[3][4],`LFE`),a(8,t[1][2],t[2][0],t[3][0],`LFE`)],s=96e3,c=88200,l=48e3,u=44100,d=32e3,ee=24e3,te=22050,ne=16e3,re=12e3,ie=11025,ae=8e3,f=`absoluteGranulePosition`,p=`bandwidth`,m=`bitDepth`,h=`bitrate`,oe=h+`Maximum`,se=h+`Minimum`,ce=h+`Nominal`,le=`buffer`,ue=le+`Fullness`,g=`codec`,_=g+`Frames`,de=`coupledStreamCount`,fe=`crc16`,pe=`crc32`,v=`data`,y=`description`,me=`duration`,he=`emphasis`,ge=`hasOpusPadding`,b=`header`,_e=`isContinuedPacket`,ve=`isCopyrighted`,ye=`isFirstPage`,be=`isHome`,x=`isLastPage`,xe=`isOriginal`,Se=`isPrivate`,Ce=`isVbr`,S=`layer`,C=`length`,w=`mode`,T=w+`Extension`,we=`mpeg`,Te=we+`Version`,Ee=`numberAACFrames`,De=`outputGain`,Oe=`preSkip`,ke=`profile`,Ae=e(),je=`protection`,Me=`segments`,E=`subarray`,Ne=`version`,Pe=`vorbis`,Fe=Pe+`Comments`,Ie=Pe+`Setup`,Le=`block`,Re=Le+`ingStrategy`,ze=e(),D=Le+`Size`,Be=Le+`size0`,Ve=Le+`size1`,He=e(),Ue=`channel`,We=Ue+`MappingFamily`,Ge=Ue+`MappingTable`,O=Ue+`Mode`,Ke=e(),k=Ue+`s`,qe=`copyright`,Je=qe+`Id`,Ye=qe+`IdStart`,A=`frame`,Xe=A+`Count`,j=A+`Length`,Ze=`Number`,Qe=A+Ze,M=A+`Padding`,N=A+`Size`,$e=`Rate`,et=`inputSample`+$e,tt=`page`,nt=tt+`Checksum`,rt=e(),it=tt+`SegmentTable`,P=tt+`SequenceNumber`,at=`sample`,ot=at+Ze,F=at+$e,I=e(),L=at+`s`,st=`stream`,ct=st+`Count`,lt=st+`Info`,ut=st+`SerialNumber`;st+``;const dt=`total`,ft=dt+`BytesOut`,pt=dt+`Duration`,mt=dt+`Samples`,R=e(),z=e(),ht=e(),gt=e(),_t=e(),vt=e(),yt=e(),bt=e(),B=e(),xt=e(),V=e(),St=e(),Ct=e(),wt=e(),H=e(),Tt=e(),Et=e(),Dt=e(),U=Uint8Array,Ot=DataView,W=`reserved`,kt=`free`,At=`none`,jt=`16bit CRC`,Mt=(e,t,n)=>{for(let r=0;r<e[C];r++){let i=t(r);for(let e=8;e>0;e--)i=n(i);e[r]=i}return e},Nt=Mt(new U(256),e=>e,e=>e&128?7^e<<1:e<<1),G=[Mt(new Uint16Array(256),e=>e<<8,e=>e<<1^(e&32768?32773:0))],K=[Mt(new Uint32Array(256),e=>e,e=>e>>>1^(e&1)*3988292384)];for(let e=0;e<15;e++){G.push(new Uint16Array(256)),K.push(new Uint32Array(256));for(let t=0;t<=255;t++)G[e+1][t]=G[0][G[e][t]>>>8]^G[e][t]<<8,K[e+1][t]=K[e][t]>>>8^K[0][K[e][t]&255]}const Pt=e=>{let t=0,n=e[C];for(let r=0;r!==n;r++)t=Nt[t^e[r]];return t},Ft=e=>{let t=e[C],n=t-16,r=0,i=0;for(;i<=n;)r^=e[i++]<<8|e[i++],r=G[15][r>>8]^G[14][r&255]^G[13][e[i++]]^G[12][e[i++]]^G[11][e[i++]]^G[10][e[i++]]^G[9][e[i++]]^G[8][e[i++]]^G[7][e[i++]]^G[6][e[i++]]^G[5][e[i++]]^G[4][e[i++]]^G[3][e[i++]]^G[2][e[i++]]^G[1][e[i++]]^G[0][e[i++]];for(;i!==t;)r=(r&255)<<8^G[0][r>>8^e[i++]];return r},It=e=>{let t=e[C],n=t-16,r=0,i=0;for(;i<=n;)r=K[15][(e[i++]^r)&255]^K[14][(e[i++]^r>>>8)&255]^K[13][(e[i++]^r>>>16)&255]^K[12][e[i++]^r>>>24]^K[11][e[i++]]^K[10][e[i++]]^K[9][e[i++]]^K[8][e[i++]]^K[7][e[i++]]^K[6][e[i++]]^K[5][e[i++]]^K[4][e[i++]]^K[3][e[i++]]^K[2][e[i++]]^K[1][e[i++]]^K[0][e[i++]];for(;i!==t;)r=K[0][(r^e[i++])&255]^r>>>8;return r^-1},Lt=(...e)=>{let t=new U(e.reduce((e,t)=>e+t[C],0));return e.reduce((e,n)=>(t.set(n,e),e+n[C]),0),t},q=e=>String.fromCharCode(...e),Rt=[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],zt=e=>Rt[e&15]<<4|Rt[e>>4];var Bt=class{constructor(e){this._data=e,this._pos=e[C]*8}set position(e){this._pos=e}get position(){return this._pos}read(e){let t=Math.floor(this._pos/8),n=this._pos%8;return this._pos-=e,(zt(this._data[t-1])<<8)+zt(this._data[t])>>7-n&255}};const Vt=(e,t)=>{try{return e.getBigInt64(t,!0)}catch{let n=e.getUint8(t+7)&128?-1:1,r=e.getUint32(t,!0),i=e.getUint32(t+4,!0);return n===-1&&(r=~r+1,i=~i+1),i>1048575&&console.warn(`This platform does not support BigInt`),n*(r+i*2**32)}};var Ht=class{constructor(e,t){this._onCodecHeader=e,this._onCodecUpdate=t,this[H]()}[Tt](){this._isEnabled=!0}[H](){this._headerCache=new Map,this._codecUpdateData=new WeakMap,this._codecHeaderSent=!1,this._codecShouldUpdate=!1,this._bitrate=null,this._isEnabled=!1}[wt](e,t){if(this._onCodecUpdate){this._bitrate!==e&&(this._bitrate=e,this._codecShouldUpdate=!0);let n=this._codecUpdateData.get(this._headerCache.get(this._currentHeader));this._codecShouldUpdate&&n&&this._onCodecUpdate({bitrate:e,...n},t),this._codecShouldUpdate=!1}}[B](e){let t=this._headerCache.get(e);return t&&this._updateCurrentHeader(e),t}[xt](e,t,n){this._isEnabled&&(this._codecHeaderSent||=(this._onCodecHeader({...t}),!0),this._updateCurrentHeader(e),this._headerCache.set(e,t),this._codecUpdateData.set(t,n))}_updateCurrentHeader(e){this._onCodecUpdate&&e!==this._currentHeader&&(this._codecShouldUpdate=!0,this._currentHeader=e)}};const J=new WeakMap,Y=new WeakMap;var Ut=class{constructor(e,t){this._codecParser=e,this._headerCache=t}*[yt](){let e;do{if(e=yield*this.Frame[V](this._codecParser,this._headerCache,0),e)return e;this._codecParser[z](1)}while(!0)}*[bt](e){let t=yield*this[yt](),n=Y.get(t)[C];if(e||this._codecParser._flushing||(yield*this.Header[B](this._codecParser,this._headerCache,n)))return this._headerCache[Tt](),this._codecParser[z](n),this._codecParser[gt](t),t;this._codecParser[_t](`Missing ${A} at ${n} bytes from current position.`,`Dropping current ${A} and trying again.`),this._headerCache[H](),this._codecParser[z](1)}},Wt=class{constructor(e,t){Y.set(this,{[b]:e}),this[v]=t}},Gt=class extends Wt{static*[V](e,t,n,r,i){let a=yield*e[B](n,r,i);if(a){let e=J.get(a)[j],r=J.get(a)[L];return new t(a,(yield*n[R](e,i))[E](0,e),r)}else return null}constructor(e,t,n){super(e,t),this[b]=e,this[L]=n,this[me]=n/e[F]*1e3,this[Qe]=null,this[ft]=null,this[mt]=null,this[pt]=null,Y.get(this)[C]=t[C]}};const Kt=`unsynchronizationFlag`,qt=`extendedHeaderFlag`,Jt=`experimentalFlag`,Yt=`footerPresent`;var Xt=class e{static*getID3v2Header(t,n,r){let i={},a=yield*t[R](3,r);return a[0]!==73||a[1]!==68||a[2]!==51||(a=yield*t[R](10,r),i[Ne]=`id3v2.${a[3]}.${a[4]}`,a[5]&15)||(i[Kt]=!!(a[5]&128),i[qt]=!!(a[5]&64),i[Jt]=!!(a[5]&32),i[Yt]=!!(a[5]&16),a[6]&128||a[7]&128||a[8]&128||a[9]&128)?null:(i[C]=10+(a[6]<<21|a[7]<<14|a[8]<<7|a[9]),new e(i))}constructor(e){this[Ne]=e[Ne],this[Kt]=e[Kt],this[qt]=e[qt],this[Jt]=e[Jt],this[Yt]=e[Yt],this[C]=e[C]}},Zt=class{constructor(e){J.set(this,e),this[m]=e[m],this[h]=null,this[k]=e[k],this[O]=e[O],this[F]=e[F]}};const Qt={0:[kt,kt,kt,kt,kt],16:[32,32,32,32,8],240:[`bad`,`bad`,`bad`,`bad`,`bad`]},$t=(e,t,n)=>8*((e+n)%t+t)*(1<<(e+n)/t)-8*t*(t/8|0);for(let e=2;e<15;e++)Qt[e<<4]=[e*32,$t(e,4,0),$t(e,4,-1),$t(e,8,4),$t(e,8,0)];const en=`bands `,tn=` to 31`,nn={0:en+4+tn,16:en+8+tn,32:en+12+tn,48:en+16+tn},rn=`bitrateIndex`,an=`Intensity stereo `,on={0:an+`off, MS stereo off`,16:an+`on, MS stereo off`,32:an+`off, MS stereo on`,48:an+`on, MS stereo on`},sn={0:{[y]:W},2:{[y]:`Layer III`,[M]:1,[T]:on,v1:{[rn]:2,[L]:1152},v2:{[rn]:4,[L]:576}},4:{[y]:`Layer II`,[M]:1,[T]:nn,[L]:1152,v1:{[rn]:1},v2:{[rn]:4}},6:{[y]:`Layer I`,[M]:4,[T]:nn,[L]:384,v1:{[rn]:0},v2:{[rn]:3}}},cn=`MPEG Version `,ln=`ISO/IEC `,un={0:{[y]:`${cn}2.5 (later extension of MPEG 2)`,[S]:`v2`,[F]:{0:ie,4:re,8:ae,12:W}},8:{[y]:W},16:{[y]:`${cn}2 (${ln}13818-3)`,[S]:`v2`,[F]:{0:te,4:ee,8:ne,12:W}},24:{[y]:`${cn}1 (${ln}11172-3)`,[S]:`v1`,[F]:{0:u,4:l,8:d,12:W}},length:C},dn={0:jt,1:At},fn={0:At,1:`50/15 ms`,2:W,3:`CCIT J.17`},pn={0:{[k]:2,[y]:r},64:{[k]:2,[y]:`joint `+r},128:{[k]:2,[y]:`dual channel`},192:{[k]:1,[y]:n}};var mn=class e extends Zt{static*[B](t,n,r){let i={},a=yield*Xt.getID3v2Header(t,n,r);a&&(yield*t[R](a[C],r),t[z](a[C]));let o=yield*t[R](4,r),s=q(o[E](0,4)),c=n[B](s);if(c)return new e(c);if(o[0]!==255||o[1]<224)return null;let l=un[o[1]&24];if(l[y]===W)return null;let u=o[1]&6;if(sn[u][y]===W)return null;let d={...sn[u],...sn[u][l[S]]};if(i[Te]=l[y],i[S]=d[y],i[L]=d[L],i[je]=dn[o[1]&1],i[C]=4,i[h]=Qt[o[2]&240][d[rn]],i[h]===`bad`||(i[F]=l[F][o[2]&12],i[F]===W)||(i[M]=o[2]&2&&d[M],i[Se]=!!(o[2]&1),i[j]=Math.floor(125*i[h]*i[L]/i[F]+i[M]),!i[j]))return null;let ee=o[3]&192;if(i[O]=pn[ee][y],i[k]=pn[ee][k],i[T]=d[T][o[3]&48],i[ve]=!!(o[3]&8),i[xe]=!!(o[3]&4),i[he]=fn[o[3]&3],i[he]===W)return null;i[m]=16;{let{length:e,frameLength:t,samples:r,...a}=i;n[xt](s,i,a)}return new e(i)}constructor(e){super(e),this[h]=e[h],this[he]=e[he],this[M]=e[M],this[ve]=e[ve],this[xe]=e[xe],this[Se]=e[Se],this[S]=e[S],this[T]=e[T],this[Te]=e[Te],this[je]=e[je]}},hn=class e extends Gt{static*[V](t,n,r){return yield*super[V](mn,e,t,n,r)}constructor(e,t,n){super(e,t,n)}},gn=class extends Ut{constructor(e,t,n){super(e,t),this.Frame=hn,this.Header=mn,n(this[g])}get[g](){return we}*[St](){return yield*this[bt]()}};const _n={0:`MPEG-4`,8:`MPEG-2`},vn={0:`valid`,2:`bad`,4:`bad`,6:`bad`},yn={0:jt,1:At},bn={0:`AAC Main`,64:`AAC LC (Low Complexity)`,128:`AAC SSR (Scalable Sample Rate)`,192:`AAC LTP (Long Term Prediction)`},xn={0:s,4:c,8:64e3,12:l,16:u,20:d,24:ee,28:te,32:ne,36:re,40:ie,44:ae,48:7350,52:W,56:W,60:`frequency is written explicitly`},Sn={0:{[k]:0,[y]:`Defined in AOT Specific Config`},64:{[k]:1,[y]:n},128:{[k]:2,[y]:a(2,t[0][0])},192:{[k]:3,[y]:a(3,t[1][3])},256:{[k]:4,[y]:a(4,t[1][3],t[3][4])},320:{[k]:5,[y]:a(5,t[1][3],t[3][0])},384:{[k]:6,[y]:a(6,t[1][3],t[3][0],`LFE`)},448:{[k]:8,[y]:a(8,t[1][3],t[2][0],t[3][0],`LFE`)}};var Cn=class e extends Zt{static*[B](t,n,r){let i={},a=yield*t[R](7,r),o=q([a[0],a[1],a[2],a[3]&252|a[6]&3]),s=n[B](o);if(s)Object.assign(i,s);else{if(a[0]!==255||a[1]<240||(i[Te]=_n[a[1]&8],i[S]=vn[a[1]&6],i[S]===`bad`))return null;let e=a[1]&1;i[je]=yn[e],i[C]=e?7:9,i[Ae]=a[2]&192,i[I]=a[2]&60;let t=a[2]&2;if(i[ke]=bn[i[Ae]],i[F]=xn[i[I]],i[F]===W)return null;i[Se]=!!t,i[Ke]=(a[2]<<8|a[3])&448,i[O]=Sn[i[Ke]][y],i[k]=Sn[i[Ke]][k],i[xe]=!!(a[3]&32),i[be]=!!(a[3]&8),i[Je]=!!(a[3]&8),i[Ye]=!!(a[3]&4),i[m]=16,i[L]=1024,i[Ee]=a[6]&3;{let{length:e,channelModeBits:t,profileBits:r,sampleRateBits:a,frameLength:s,samples:c,numberAACFrames:l,...u}=i;n[xt](o,i,u)}}if(i[j]=(a[3]<<11|a[4]<<3|a[5]>>5)&8191,!i[j])return null;let c=(a[5]<<6|a[6]>>2)&2047;return i[ue]=c===2047?`VBR`:c,new e(i)}constructor(e){super(e),this[Je]=e[Je],this[Ye]=e[Ye],this[ue]=e[ue],this[be]=e[be],this[xe]=e[xe],this[Se]=e[Se],this[S]=e[S],this[C]=e[C],this[Te]=e[Te],this[Ee]=e[Ee],this[ke]=e[ke],this[je]=e[je]}get audioSpecificConfig(){let e=J.get(this),t=e[Ae]+64<<5|e[I]<<5|e[Ke]>>3,n=new U(2);return new Ot(n[le]).setUint16(0,t,!1),n}},wn=class e extends Gt{static*[V](t,n,r){return yield*super[V](Cn,e,t,n,r)}constructor(e,t,n){super(e,t,n)}},Tn=class extends Ut{constructor(e,t,n){super(e,t),this.Frame=wn,this.Header=Cn,n(this[g])}get[g](){return`aac`}*[St](){return yield*this[bt]()}},En=class e extends Gt{static _getFrameFooterCrc16(e){return(e[e[C]-2]<<8)+e[e[C]-1]}static[Dt](t){return e._getFrameFooterCrc16(t)===Ft(t[E](0,-2))}constructor(t,n,r){n[lt]=r,n[fe]=e._getFrameFooterCrc16(t),super(n,t,J.get(n)[L])}};const Dn=`get from STREAMINFO metadata block`,On={0:`Fixed`,1:`Variable`},kn={0:W,16:192};for(let e=2;e<16;e++)kn[e<<4]=e<6?576*2**(e-2):2**e;const An={0:Dn,1:c,2:176400,3:192e3,4:ae,5:ne,6:te,7:ee,8:d,9:u,10:l,11:s,15:`bad`},jn={0:{[k]:1,[y]:n},16:{[k]:2,[y]:a(2,t[0][0])},32:{[k]:3,[y]:a(3,t[0][1])},48:{[k]:4,[y]:a(4,t[1][0],t[3][0])},64:{[k]:5,[y]:a(5,t[1][1],t[3][0])},80:{[k]:6,[y]:a(6,t[1][1],`LFE`,t[3][0])},96:{[k]:7,[y]:a(7,t[1][1],`LFE`,t[3][4],t[2][0])},112:{[k]:8,[y]:a(8,t[1][1],`LFE`,t[3][0],t[2][0])},128:{[k]:2,[y]:`${r} (left, diff)`},144:{[k]:2,[y]:`${r} (diff, right)`},160:{[k]:2,[y]:`${r} (avg, diff)`},176:W,192:W,208:W,224:W,240:W},Mn={0:Dn,2:8,4:12,6:W,8:16,10:20,12:24,14:W};var Nn=class e extends Zt{static _decodeUTF8Int(e){if(e[0]>254)return null;if(e[0]<128)return{value:e[0],length:1};let t=1;for(let n=64;n&e[0];n>>=1)t++;let n=t-1,r=0,i=0;for(;n>0;i+=6,n--){if((e[n]&192)!=128)return null;r|=(e[n]&63)<<i}return r|=(e[n]&127>>t)<<i,{value:r,length:t}}static[Et](t,n){let r={[R]:function*(){return t}};return e[B](r,n,0).next().value}static*[B](t,n,r){let i=yield*t[R](6,r);if(i[0]!==255||!(i[1]===248||i[1]===249))return null;let a={},o=q(i[E](0,4)),s=n[B](o);if(s)Object.assign(a,s);else{if(a[ze]=i[1]&1,a[Re]=On[a[ze]],a[He]=i[2]&240,a[I]=i[2]&15,a[D]=kn[a[He]],a[D]===W||(a[F]=An[a[I]],a[F]===`bad`)||i[3]&1)return null;let e=jn[i[3]&240];if(e===W||(a[k]=e[k],a[O]=e[y],a[m]=Mn[i[3]&14],a[m]===W))return null}a[C]=5,i=yield*t[R](a[C]+8,r);let c=e._decodeUTF8Int(i[E](4));if(!c||(a[ze]?a[ot]=c.value:a[Qe]=c.value,a[C]+=c[C],a[He]===96?(i[C]<a[C]&&(i=yield*t[R](a[C],r)),a[D]=i[a[C]-1]+1,a[C]+=1):a[He]===112&&(i[C]<a[C]&&(i=yield*t[R](a[C],r)),a[D]=(i[a[C]-1]<<8)+i[a[C]]+1,a[C]+=2),a[L]=a[D],a[I]===12?(i[C]<a[C]&&(i=yield*t[R](a[C],r)),a[F]=i[a[C]-1]*1e3,a[C]+=1):a[I]===13?(i[C]<a[C]&&(i=yield*t[R](a[C],r)),a[F]=(i[a[C]-1]<<8)+i[a[C]],a[C]+=2):a[I]===14&&(i[C]<a[C]&&(i=yield*t[R](a[C],r)),a[F]=((i[a[C]-1]<<8)+i[a[C]])*10,a[C]+=2),i[C]<a[C]&&(i=yield*t[R](a[C],r)),a.crc=i[a[C]-1],a.crc!==Pt(i[E](0,a[C]-1))))return null;if(!s){let{blockingStrategyBits:e,frameNumber:t,sampleNumber:r,samples:i,sampleRateBits:s,blockSizeBits:c,crc:l,length:u,...d}=a;n[xt](o,a,d)}return new e(a)}constructor(e){super(e),this[fe]=null,this[Re]=e[Re],this[D]=e[D],this[Qe]=e[Qe],this[ot]=e[ot],this[lt]=null}},Pn=class extends Ut{constructor(e,t,n){super(e,t),this.Frame=En,this.Header=Nn,n(this[g])}get[g](){return`flac`}*_getNextFrameSyncOffset(e){let t=yield*this._codecParser[R](2,0),n=t[C]-2;for(;e<n;){if(t[e]===255){let n=t[e+1];if(n===248||n===249)break;n!==255&&e++}e++}return e}*[St](){do{let e=yield*Nn[B](this._codecParser,this._headerCache,0);if(e){let t=J.get(e)[C]+2;for(;t<=524288;){if(this._codecParser._flushing||(yield*Nn[B](this._codecParser,this._headerCache,t))){let n=yield*this._codecParser[R](t);if(this._codecParser._flushing||(n=n[E](0,t)),En[Dt](n)){let r=new En(n,e);return this._headerCache[Tt](),this._codecParser[z](t),this._codecParser[gt](r),r}}t=yield*this._getNextFrameSyncOffset(t+1)}this._codecParser[_t](`Unable to sync FLAC frame after searching ${t} bytes.`),this._codecParser[z](t)}else this._codecParser[z](yield*this._getNextFrameSyncOffset(1))}while(!0)}[Ct](e){return e[P]===0?(this._headerCache[Tt](),this._streamInfo=e[v][E](13)):e[P]===1||(e[_]=Y.get(e)[Me].map(e=>{let t=Nn[Et](e,this._headerCache);if(t)return new En(e,t,this._streamInfo);this._codecParser[_t](`Failed to parse Ogg FLAC frame`,`Skipping invalid FLAC frame`)}).filter(e=>!!e)),e}},Fn=class e{static*[B](t,n,r){let i={},a=yield*t[R](28,r);if(a[0]!==79||a[1]!==103||a[2]!==103||a[3]!==83||(i.streamStructureVersion=a[4],a[5]&248))return null;i[x]=!!(a[5]&4),i[ye]=!!(a[5]&2),i[_e]=!!(a[5]&1);let o=new Ot(U.from(a[E](0,28))[le]);i[f]=Vt(o,6),i[ut]=o.getInt32(14,!0),i[P]=o.getInt32(18,!0),i[nt]=o.getInt32(22,!0);let s=a[26];i[C]=s+27,a=yield*t[R](i[C],r),i[j]=0,i[it]=[],i[rt]=U.from(a[E](27,i[C]));for(let e=0,t=0;e<s;e++){let n=i[rt][e];i[j]+=n,t+=n,(n!==255||e===s-1)&&(i[it].push(t),t=0)}return new e(i)}constructor(e){J.set(this,e),this[f]=e[f],this[_e]=e[_e],this[ye]=e[ye],this[x]=e[x],this[it]=e[it],this[P]=e[P],this[nt]=e[nt],this[ut]=e[ut]}},In=class e extends Wt{static*[V](t,n,r){let i=yield*Fn[B](t,n,r);if(i){let n=J.get(i)[j],r=J.get(i)[C],a=r+n,o=(yield*t[R](a,0))[E](0,a);return new e(i,o[E](r,a),o)}else return null}constructor(e,t,n){super(e,t),Y.get(this)[C]=n[C],this[_]=[],this.rawData=n,this[f]=e[f],this[pe]=e[nt],this[me]=0,this[_e]=e[_e],this[ye]=e[ye],this[x]=e[x],this[P]=e[P],this[L]=0,this[ut]=e[ut]}},Ln=class extends Gt{constructor(e,t,n){super(t,e,n)}};const Rn={0:o.slice(0,2),1:o},X=`SILK-only`,Z=`CELT-only`,zn=`Hybrid`,Q=`narrowband`,Bn=`medium-band`,$=`wideband`,Vn=`super-wideband`,Hn=`fullband`,Un={0:{[w]:X,[p]:Q,[N]:10},8:{[w]:X,[p]:Q,[N]:20},16:{[w]:X,[p]:Q,[N]:40},24:{[w]:X,[p]:Q,[N]:60},32:{[w]:X,[p]:Bn,[N]:10},40:{[w]:X,[p]:Bn,[N]:20},48:{[w]:X,[p]:Bn,[N]:40},56:{[w]:X,[p]:Bn,[N]:60},64:{[w]:X,[p]:$,[N]:10},72:{[w]:X,[p]:$,[N]:20},80:{[w]:X,[p]:$,[N]:40},88:{[w]:X,[p]:$,[N]:60},96:{[w]:zn,[p]:Vn,[N]:10},104:{[w]:zn,[p]:Vn,[N]:20},112:{[w]:zn,[p]:Hn,[N]:10},120:{[w]:zn,[p]:Hn,[N]:20},128:{[w]:Z,[p]:Q,[N]:2.5},136:{[w]:Z,[p]:Q,[N]:5},144:{[w]:Z,[p]:Q,[N]:10},152:{[w]:Z,[p]:Q,[N]:20},160:{[w]:Z,[p]:$,[N]:2.5},168:{[w]:Z,[p]:$,[N]:5},176:{[w]:Z,[p]:$,[N]:10},184:{[w]:Z,[p]:$,[N]:20},192:{[w]:Z,[p]:Vn,[N]:2.5},200:{[w]:Z,[p]:Vn,[N]:5},208:{[w]:Z,[p]:Vn,[N]:10},216:{[w]:Z,[p]:Vn,[N]:20},224:{[w]:Z,[p]:Hn,[N]:2.5},232:{[w]:Z,[p]:Hn,[N]:5},240:{[w]:Z,[p]:Hn,[N]:10},248:{[w]:Z,[p]:Hn,[N]:20}};var Wn=class e extends Zt{static[Et](t,n,r){let i={};if(i[k]=t[9],i[We]=t[18],i[C]=i[We]===0?19:21+i[k],t[C]<i[C])throw Error(`Out of data while inside an Ogg Page`);let a=n[0]&3,o=a===3?2:1,s=q(t[E](0,i[C]))+q(n[E](0,o)),c=r[B](s);if(c)return new e(c);if(s.substr(0,8)!==`OpusHead`||t[8]!==1)return null;i[v]=U.from(t[E](0,i[C]));let u=new Ot(i[v][le]);if(i[m]=16,i[Oe]=u.getUint16(10,!0),i[et]=u.getUint32(12,!0),i[F]=l,i[De]=u.getInt16(16,!0),i[We]in Rn&&(i[O]=Rn[i[We]][i[k]-1],!i[O]))return null;i[We]!==0&&(i[ct]=t[19],i[de]=t[20],i[Ge]=[...t[E](21,i[k]+21)]);let d=Un[248&n[0]];switch(i[w]=d[w],i[p]=d[p],i[N]=d[N],a){case 0:i[Xe]=1;break;case 1:case 2:i[Xe]=2;break;case 3:i[Ce]=!!(128&n[1]),i[ge]=!!(64&n[1]),i[Xe]=63&n[1];break;default:return null}{let{length:e,data:t,channelMappingFamily:n,...a}=i;r[xt](s,i,a)}return new e(i)}constructor(e){super(e),this[v]=e[v],this[p]=e[p],this[We]=e[We],this[Ge]=e[Ge],this[de]=e[de],this[Xe]=e[Xe],this[N]=e[N],this[ge]=e[ge],this[et]=e[et],this[Ce]=e[Ce],this[w]=e[w],this[De]=e[De],this[Oe]=e[Oe],this[ct]=e[ct]}},Gn=class extends Ut{constructor(e,t,n){super(e,t),this.Frame=Ln,this.Header=Wn,n(this[g]),this._identificationHeader=null,this._preSkipRemaining=null}get[g](){return`opus`}[Ct](e){return e[P]===0?(this._headerCache[Tt](),this._identificationHeader=e[v]):e[P]===1||(e[_]=Y.get(e)[Me].map(e=>{let t=Wn[Et](this._identificationHeader,e,this._headerCache);if(t){this._preSkipRemaining===null&&(this._preSkipRemaining=t[Oe]);let n=t[N]*t[Xe]/1e3*t[F];return this._preSkipRemaining>0&&(this._preSkipRemaining-=n,n=this._preSkipRemaining<0?-this._preSkipRemaining:0),new Ln(e,t,n)}this._codecParser[vt](`Failed to parse Ogg Opus Header`,`Not a valid Ogg Opus file`)})),e}},Kn=class extends Gt{constructor(e,t,n){super(t,e,n)}};const qn={};for(let e=0;e<8;e++)qn[e+6]=2**(6+e);var Jn=class e extends Zt{static[Et](t,n,r,i){if(t[C]<30)throw Error(`Out of data while inside an Ogg Page`);let a=q(t[E](0,30)),s=n[B](a);if(s)return new e(s);let c={[C]:30};if(a.substr(0,7)!==`vorbis`)return null;c[v]=U.from(t[E](0,30));let l=new Ot(c[v][le]);if(c[Ne]=l.getUint32(7,!0),c[Ne]!==0||(c[k]=t[11],c[O]=o[c[k]-1]||`application defined`,c[F]=l.getUint32(12,!0),c[oe]=l.getInt32(16,!0),c[ce]=l.getInt32(20,!0),c[se]=l.getInt32(24,!0),c[Ve]=qn[(t[28]&240)>>4],c[Be]=qn[t[28]&15],c[Be]>c[Ve])||t[29]!==1)return null;c[m]=32,c[Ie]=i,c[Fe]=r;{let{length:e,data:t,version:r,vorbisSetup:i,vorbisComments:o,...s}=c;n[xt](a,c,s)}return new e(c)}constructor(e){super(e),this[oe]=e[oe],this[se]=e[se],this[ce]=e[ce],this[Be]=e[Be],this[Ve]=e[Ve],this[v]=e[v],this[Fe]=e[Fe],this[Ie]=e[Ie]}},Yn=class extends Ut{constructor(e,t,n){super(e,t),this.Frame=Kn,n(this[g]),this._identificationHeader=null,this._setupComplete=!1,this._prevBlockSize=null}get[g](){return Pe}[Ct](e){e[_]=[];for(let t of Y.get(e)[Me])if(t[0]===1)this._headerCache[Tt](),this._identificationHeader=e[v],this._setupComplete=!1;else if(t[0]===3)this._vorbisComments=t;else if(t[0]===5)this._vorbisSetup=t,this._mode=this._parseSetupHeader(t),this._setupComplete=!0;else if(this._setupComplete){let n=Jn[Et](this._identificationHeader,this._headerCache,this._vorbisComments,this._vorbisSetup);n?e[_].push(new Kn(t,n,this._getSamples(t,n))):this._codecParser[logError](`Failed to parse Ogg Vorbis Header`,`Not a valid Ogg Vorbis file`)}return e}_getSamples(e,t){let n=this._mode.blockFlags[e[0]>>1&this._mode.mask]?t[Ve]:t[Be],r=this._prevBlockSize===null?0:(this._prevBlockSize+n)/4;return this._prevBlockSize=n,r}_parseSetupHeader(e){let t=new Bt(e),n={count:0,blockFlags:[]};for(;(t.read(1)&1)!=1;);let r;for(;n.count<64&&t.position>0;){zt(t.read(8));let e=0;for(;t.read(8)===0&&e++<3;);if(e===4)r=t.read(7),n.blockFlags.unshift(r&1),t.position+=6,n.count++;else{((zt(r)&126)>>1)+1!==n.count&&this._codecParser[_t](`vorbis derived mode count did not match actual mode count`);break}}return n.mask=(1<<Math.log2(n.count))-1,n}},Xn=class{constructor(e,t,n){this._codecParser=e,this._headerCache=t,this._onCodec=n,this._continuedPacket=new U,this._codec=null,this._isSupported=null,this._previousAbsoluteGranulePosition=null}get[g](){return this._codec||``}_updateCodec(e,t){this._codec!==e&&(this._headerCache[H](),this._parser=new t(this._codecParser,this._headerCache,this._onCodec),this._codec=e)}_checkCodecSupport({data:e}){let t=q(e[E](0,8));switch(t){case`fishead\0`:return!1;case`OpusHead`:return this._updateCodec(`opus`,Gn),!0;case/^\x7fFLAC/.test(t)&&t:return this._updateCodec(`flac`,Pn),!0;case/^\x01vorbis/.test(t)&&t:return this._updateCodec(Pe,Yn),!0;default:return!1}}_checkPageSequenceNumber(e){e[P]!==this._pageSequenceNumber+1&&this._pageSequenceNumber>1&&e[P]>1&&this._codecParser[_t](`Unexpected gap in Ogg Page Sequence Number.`,`Expected: ${this._pageSequenceNumber+1}, Got: ${e[P]}`),this._pageSequenceNumber=e[P]}_parsePage(e){this._isSupported===null&&(this._pageSequenceNumber=e[P],this._isSupported=this._checkCodecSupport(e)),this._checkPageSequenceNumber(e);let t=Y.get(e),n=J.get(t[b]),r=0;if(t[Me]=n[it].map(t=>e[v][E](r,r+=t)),this._continuedPacket[C]&&(t[Me][0]=Lt(this._continuedPacket,t[Me][0]),this._continuedPacket=new U),n[rt][n[rt][C]-1]===255&&(this._continuedPacket=Lt(this._continuedPacket,t[Me].pop())),this._previousAbsoluteGranulePosition!==null&&(e[L]=Number(e[f]-this._previousAbsoluteGranulePosition)),this._previousAbsoluteGranulePosition=e[f],this._isSupported){let t=this._parser[Ct](e);return this._codecParser[gt](t),t}else return e}},Zn=class extends Ut{constructor(e,t,n){super(e,t),this._onCodec=n,this.Frame=In,this.Header=Fn,this._streams=new Map,this._currentSerialNumber=null}get[g](){let e=this._streams.get(this._currentSerialNumber);return e?e.codec:``}*[St](){let e=yield*this[bt](!0);this._currentSerialNumber=e[ut];let t=this._streams.get(this._currentSerialNumber);return t||(t=new Xn(this._codecParser,this._headerCache,this._onCodec),this._streams.set(this._currentSerialNumber,t)),e[x]&&this._streams.delete(this._currentSerialNumber),t._parsePage(e)}};const Qn=()=>{};var $n=class{constructor(e,{onCodec:t,onCodecHeader:n,onCodecUpdate:r,enableLogging:i=!1,enableFrameCRC32:a=!0}={}){this._inputMimeType=e,this._onCodec=t||Qn,this._onCodecHeader=n||Qn,this._onCodecUpdate=r,this._enableLogging=i,this._crc32=a?It:Qn,this[H]()}get[g](){return this._parser?this._parser[g]:``}[H](){this._headerCache=new Ht(this._onCodecHeader,this._onCodecUpdate),this._generator=this._getGenerator(),this._generator.next()}*flush(){this._flushing=!0;for(let e=this._generator.next();e.value;e=this._generator.next())yield e.value;this._flushing=!1,this[H]()}*parseChunk(e){for(let t=this._generator.next(e);t.value;t=this._generator.next())yield t.value}parseAll(e){return[...this.parseChunk(e),...this.flush()]}*_getGenerator(){if(this._inputMimeType.match(/aac/))this._parser=new Tn(this,this._headerCache,this._onCodec);else if(this._inputMimeType.match(/mpeg/))this._parser=new gn(this,this._headerCache,this._onCodec);else if(this._inputMimeType.match(/flac/))this._parser=new Pn(this,this._headerCache,this._onCodec);else if(this._inputMimeType.match(/ogg/))this._parser=new Zn(this,this._headerCache,this._onCodec);else throw Error(`Unsupported Codec ${mimeType}`);for(this._frameNumber=0,this._currentReadPosition=0,this._totalBytesIn=0,this._totalBytesOut=0,this._totalSamples=0,this._sampleRate=void 0,this._rawData=new Uint8Array;;){let e=yield*this._parser[St]();e&&(yield e)}}*[R](e=0,t=0){let n;for(;this._rawData[C]<=e+t;){if(n=yield,this._flushing)return this._rawData[E](t);n&&(this._totalBytesIn+=n[C],this._rawData=Lt(this._rawData,n))}return this._rawData[E](t)}[z](e){this._currentReadPosition+=e,this._rawData=this._rawData[E](e)}[ht](e){this._sampleRate=e[b][F],e[b][h]=e[me]>0?Math.round(e[v][C]/e[me])*8:0,e[Qe]=this._frameNumber++,e[ft]=this._totalBytesOut,e[mt]=this._totalSamples,e[pt]=this._totalSamples/this._sampleRate*1e3,e[pe]=this._crc32(e[v]),this._headerCache[wt](e[b][h],e[pt]),this._totalBytesOut+=e[v][C],this._totalSamples+=e[L]}[gt](e){if(e[_]){if(e[x]){let t=e[L];e[_].forEach(e=>{let n=e[L];t<n&&(e[L]=t>0?t:0,e[me]=e[L]/e[b][F]*1e3),t-=n,this[ht](e)})}else e[L]=0,e[_].forEach(t=>{e[L]+=t[L],this[ht](t)});e[me]=e[L]/this._sampleRate*1e3||0,e[mt]=this._totalSamples,e[pt]=this._totalSamples/this._sampleRate*1e3||0,e[ft]=this._totalBytesOut}else this[ht](e)}_log(e,t){if(this._enableLogging){let n=[`${g}: ${this[g]}`,`inputMimeType: ${this._inputMimeType}`,`readPosition: ${this._currentReadPosition}`,`totalBytesIn: ${this._totalBytesIn}`,`${ft}: ${this._totalBytesOut}`],r=Math.max(...n.map(e=>e[C]));t.push(`--stats--${`-`.repeat(r-9)}`,...n,`-`.repeat(r)),e(`codec-parser`,t.reduce((e,t)=>e+`
2
+ `+t,``))}}[_t](...e){this._log(console.warn,e)}[vt](...e){this._log(console.error,e)}};const er=_,tr=v,nr=b,rr=x,ir=Ie,ar=mt;export{rr as a,nr as i,$n as n,ar as o,tr as r,ir as s,er as t};
3
+ //# sourceMappingURL=codec-parser-C_xB6wjM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-parser-C_xB6wjM.mjs","names":["absoluteGranulePosition","bandwidth","bitDepth","bitrate","bitrateMaximum","bitrateMinimum","bitrateNominal","buffer","bufferFullness","codec","codecFrames","coupledStreamCount","crc","crc16","crc32","data","description","duration","emphasis","hasOpusPadding","header","isContinuedPacket","isCopyrighted","isFirstPage","isHome","isLastPage","isOriginal","isPrivate","isVbr","layer","length","mode","modeExtension","mpeg","mpegVersion","numberAACFrames","outputGain","preSkip","profile","protection","rawData","segments","subarray","version","vorbis","vorbisComments","vorbisSetup","blockingStrategy","blockSize","blocksize0","blocksize1","channelMappingFamily","channelMappingTable","channelMode","channels","copyrightId","copyrightIdStart","frame","frameCount","frameLength","Number","frameNumber","framePadding","frameSize","inputSampleRate","pageChecksum","pageSegmentTable","pageSequenceNumber","sampleNumber","sampleRate","samples","streamCount","streamInfo","streamSerialNumber","streamStructureVersion","totalBytesOut","totalDuration","totalSamples","logError","length","length","frame","header","data","frameLength","samples","subarray","header","duration","sampleRate","frameNumber","totalBytesOut","totalSamples","totalDuration","length","version","length","bitDepth","bitrate","channels","channelMode","sampleRate","description","framePadding","modeExtension","samples","layer","sampleRate","protectionValues","channels","length","subarray","mpegVersion","protection","bitrate","isPrivate","frameLength","channelMode","isCopyrighted","isOriginal","emphasis","bitDepth","codec","mpeg","channels","description","mpegVersion","layer","protection","length","profile","sampleRate","isPrivate","channelMode","isOriginal","isHome","copyrightId","copyrightIdStart","bitDepth","samples","numberAACFrames","frameLength","bufferFullness","buffer","codec","length","subarray","streamInfo","crc16","samples","channels","description","subarray","blockingStrategy","blockSize","sampleRate","channelMode","bitDepth","length","sampleNumber","frameNumber","samples","crc","crc16","streamInfo","codec","length","subarray","pageSequenceNumber","data","codecFrames","segments","streamStructureVersion","isLastPage","isFirstPage","isContinuedPacket","subarray","buffer","absoluteGranulePosition","streamSerialNumber","pageSequenceNumber","pageChecksum","length","frameLength","pageSegmentTable","frameLength","length","subarray","codecFrames","rawData","absoluteGranulePosition","crc32","pageChecksum","duration","isContinuedPacket","isFirstPage","isLastPage","pageSequenceNumber","samples","streamSerialNumber","mode","bandwidth","frameSize","channels","channelMappingFamily","length","subarray","data","buffer","bitDepth","preSkip","inputSampleRate","sampleRate","outputGain","channelMode","streamCount","coupledStreamCount","channelMappingTable","frameCount","isVbr","hasOpusPadding","codec","pageSequenceNumber","data","codecFrames","segments","preSkip","frameSize","frameCount","sampleRate","logError","length","subarray","data","buffer","version","channels","channelMode","sampleRate","bitrateMaximum","bitrateNominal","bitrateMinimum","blocksize1","blocksize0","bitDepth","vorbisSetup","vorbisComments","codec","vorbis","codecFrames","segments","data","blocksize1","blocksize0","codec","subarray","vorbis","pageSequenceNumber","header","segments","pageSegmentTable","data","length","samples","absoluteGranulePosition","streamSerialNumber","isLastPage","codec","length","subarray","header","sampleRate","bitrate","duration","data","frameNumber","totalBytesOut","totalSamples","totalDuration","crc32","samples","codecFrames","isLastPage","logError","constants.absoluteGranulePosition","constants.bandwidth","constants.bitDepth","constants.bitrate","constants.bitrateMaximum","constants.bitrateMinimum","constants.bitrateNominal","constants.buffer","constants.bufferFullness","constants.codec","constants.codecFrames","constants.coupledStreamCount","constants.crc","constants.crc16","constants.crc32","constants.data","constants.description","constants.duration","constants.emphasis","constants.hasOpusPadding","constants.header","constants.isContinuedPacket","constants.isCopyrighted","constants.isFirstPage","constants.isHome","constants.isLastPage","constants.isOriginal","constants.isPrivate","constants.isVbr","constants.layer","constants.length","constants.mode","constants.modeExtension","constants.mpeg","constants.mpegVersion","constants.numberAACFrames","constants.outputGain","constants.preSkip","constants.profile","constants.protection","constants.rawData","constants.segments","constants.subarray","constants.version","constants.vorbis","constants.vorbisComments","constants.vorbisSetup","constants.blockingStrategy","constants.blockSize","constants.blocksize0","constants.blocksize1","constants.channelMappingFamily","constants.channelMappingTable","constants.channelMode","constants.channels","constants.copyrightId","constants.copyrightIdStart","constants.frame","constants.frameCount","constants.frameLength","constants.frameNumber","constants.framePadding","constants.frameSize","constants.inputSampleRate","constants.pageChecksum","constants.pageSegmentTable","constants.pageSequenceNumber","constants.sampleNumber","constants.sampleRate","constants.samples","constants.streamCount","constants.streamInfo","constants.streamSerialNumber","constants.streamStructureVersion","constants.totalBytesOut","constants.totalDuration","constants.totalSamples"],"sources":["../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/constants.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/utilities.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/HeaderCache.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/globals.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/Parser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/containers/Frame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/CodecFrame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/metadata/ID3v2.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/CodecHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/mpeg/MPEGHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/mpeg/MPEGFrame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/mpeg/MPEGParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/aac/AACHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/aac/AACFrame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/aac/AACParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/flac/FLACFrame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/flac/FLACHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/flac/FLACParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/containers/ogg/OggPageHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/containers/ogg/OggPage.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/opus/OpusFrame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/opus/OpusHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/opus/OpusParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/vorbis/VorbisFrame.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/vorbis/VorbisHeader.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/codecs/vorbis/VorbisParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/containers/ogg/OggParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/src/CodecParser.js","../../../node_modules/.bun/codec-parser@2.5.0/node_modules/codec-parser/index.js"],"sourcesContent":["const symbol = Symbol;\n\n// prettier-ignore\n/*\n[\n [\n \"left, right\",\n \"left, right, center\",\n \"left, center, right\",\n \"center, left, right\",\n \"center\"\n ],\n [\n \"front left, front right\",\n \"front left, front right, front center\",\n \"front left, front center, front right\",\n \"front center, front left, front right\",\n \"front center\"\n ],\n [\n \"side left, side right\",\n \"side left, side right, side center\",\n \"side left, side center, side right\",\n \"side center, side left, side right\",\n \"side center\"\n ],\n [\n \"rear left, rear right\",\n \"rear left, rear right, rear center\",\n \"rear left, rear center, rear right\",\n \"rear center, rear left, rear right\",\n \"rear center\"\n ]\n]\n*/\n\nconst mappingJoin = \", \";\n\nexport const channelMappings = (() => {\n const front = \"front\";\n const side = \"side\";\n const rear = \"rear\";\n const left = \"left\";\n const center = \"center\";\n const right = \"right\";\n\n return [\"\", front + \" \", side + \" \", rear + \" \"].map((x) =>\n [\n [left, right],\n [left, right, center],\n [left, center, right],\n [center, left, right],\n [center],\n ].flatMap((y) => y.map((z) => x + z).join(mappingJoin)),\n );\n})();\n\nexport const lfe = \"LFE\";\nexport const monophonic = \"monophonic (mono)\";\nexport const stereo = \"stereo\";\nconst surround = \"surround\";\n\nexport const getChannelMapping = (channelCount, ...mappings) =>\n `${\n [\n monophonic,\n stereo,\n `linear ${surround}`,\n \"quadraphonic\",\n `5.0 ${surround}`,\n `5.1 ${surround}`,\n `6.1 ${surround}`,\n `7.1 ${surround}`,\n ][channelCount - 1]\n } (${mappings.join(mappingJoin)})`;\n\n// prettier-ignore\nexport const vorbisOpusChannelMapping = [\n monophonic,\n getChannelMapping(2,channelMappings[0][0]),\n getChannelMapping(3,channelMappings[0][2]),\n getChannelMapping(4,channelMappings[1][0],channelMappings[3][0]),\n getChannelMapping(5,channelMappings[1][2],channelMappings[3][0]),\n getChannelMapping(6,channelMappings[1][2],channelMappings[3][0],lfe),\n getChannelMapping(7,channelMappings[1][2],channelMappings[2][0],channelMappings[3][4],lfe),\n getChannelMapping(8,channelMappings[1][2],channelMappings[2][0],channelMappings[3][0],lfe),\n]\n\n// sampleRates\nexport const rate192000 = 192000;\nexport const rate176400 = 176400;\nexport const rate96000 = 96000;\nexport const rate88200 = 88200;\nexport const rate64000 = 64000;\nexport const rate48000 = 48000;\nexport const rate44100 = 44100;\nexport const rate32000 = 32000;\nexport const rate24000 = 24000;\nexport const rate22050 = 22050;\nexport const rate16000 = 16000;\nexport const rate12000 = 12000;\nexport const rate11025 = 11025;\nexport const rate8000 = 8000;\nexport const rate7350 = 7350;\n\n// header key constants\nexport const absoluteGranulePosition = \"absoluteGranulePosition\";\nexport const bandwidth = \"bandwidth\";\nexport const bitDepth = \"bitDepth\";\nexport const bitrate = \"bitrate\";\nexport const bitrateMaximum = bitrate + \"Maximum\";\nexport const bitrateMinimum = bitrate + \"Minimum\";\nexport const bitrateNominal = bitrate + \"Nominal\";\nexport const buffer = \"buffer\";\nexport const bufferFullness = buffer + \"Fullness\";\nexport const codec = \"codec\";\nexport const codecFrames = codec + \"Frames\";\nexport const coupledStreamCount = \"coupledStreamCount\";\nexport const crc = \"crc\";\nexport const crc16 = crc + \"16\";\nexport const crc32 = crc + \"32\";\nexport const data = \"data\";\nexport const description = \"description\";\nexport const duration = \"duration\";\nexport const emphasis = \"emphasis\";\nexport const hasOpusPadding = \"hasOpusPadding\";\nexport const header = \"header\";\nexport const isContinuedPacket = \"isContinuedPacket\";\nexport const isCopyrighted = \"isCopyrighted\";\nexport const isFirstPage = \"isFirstPage\";\nexport const isHome = \"isHome\";\nexport const isLastPage = \"isLastPage\";\nexport const isOriginal = \"isOriginal\";\nexport const isPrivate = \"isPrivate\";\nexport const isVbr = \"isVbr\";\nexport const layer = \"layer\";\nexport const length = \"length\";\nexport const mode = \"mode\";\nexport const modeExtension = mode + \"Extension\";\nexport const mpeg = \"mpeg\";\nexport const mpegVersion = mpeg + \"Version\";\nexport const numberAACFrames = \"numberAAC\" + \"Frames\";\nexport const outputGain = \"outputGain\";\nexport const preSkip = \"preSkip\";\nexport const profile = \"profile\";\nexport const profileBits = symbol();\nexport const protection = \"protection\";\nexport const rawData = \"rawData\";\nexport const segments = \"segments\";\nexport const subarray = \"subarray\";\nexport const version = \"version\";\nexport const vorbis = \"vorbis\";\nexport const vorbisComments = vorbis + \"Comments\";\nexport const vorbisSetup = vorbis + \"Setup\";\n\nconst block = \"block\";\nexport const blockingStrategy = block + \"ingStrategy\";\nexport const blockingStrategyBits = symbol();\nexport const blockSize = block + \"Size\";\nexport const blocksize0 = block + \"size0\";\nexport const blocksize1 = block + \"size1\";\nexport const blockSizeBits = symbol();\n\nconst channel = \"channel\";\nexport const channelMappingFamily = channel + \"MappingFamily\";\nexport const channelMappingTable = channel + \"MappingTable\";\nexport const channelMode = channel + \"Mode\";\nexport const channelModeBits = symbol();\nexport const channels = channel + \"s\";\n\nconst copyright = \"copyright\";\nexport const copyrightId = copyright + \"Id\";\nexport const copyrightIdStart = copyright + \"IdStart\";\n\nexport const frame = \"frame\";\nexport const frameCount = frame + \"Count\";\nexport const frameLength = frame + \"Length\";\n\nconst Number = \"Number\";\nexport const frameNumber = frame + Number;\nexport const framePadding = frame + \"Padding\";\nexport const frameSize = frame + \"Size\";\n\nconst Rate = \"Rate\";\nexport const inputSampleRate = \"inputSample\" + Rate;\n\nconst page = \"page\";\nexport const pageChecksum = page + \"Checksum\";\nexport const pageSegmentBytes = symbol();\nexport const pageSegmentTable = page + \"SegmentTable\";\nexport const pageSequenceNumber = page + \"Sequence\" + Number;\n\nconst sample = \"sample\";\nexport const sampleNumber = sample + Number;\nexport const sampleRate = sample + Rate;\nexport const sampleRateBits = symbol();\nexport const samples = sample + \"s\";\n\nconst stream = \"stream\";\nexport const streamCount = stream + \"Count\";\nexport const streamInfo = stream + \"Info\";\nexport const streamSerialNumber = stream + \"Serial\" + Number;\nexport const streamStructureVersion = stream + \"StructureVersion\";\n\nconst total = \"total\";\nexport const totalBytesOut = total + \"BytesOut\";\nexport const totalDuration = total + \"Duration\";\nexport const totalSamples = total + \"Samples\";\n\n// private methods\nexport const readRawData = symbol();\nexport const incrementRawData = symbol();\nexport const mapCodecFrameStats = symbol();\nexport const mapFrameStats = symbol();\nexport const logWarning = symbol();\nexport const logError = symbol();\nexport const syncFrame = symbol();\nexport const fixedLengthFrameSync = symbol();\nexport const getHeader = symbol();\nexport const setHeader = symbol();\nexport const getFrame = symbol();\nexport const parseFrame = symbol();\nexport const parseOggPage = symbol();\nexport const checkCodecUpdate = symbol();\nexport const reset = symbol();\nexport const enable = symbol();\nexport const getHeaderFromUint8Array = symbol();\nexport const checkFrameFooterCrc16 = symbol();\n\nexport const uint8Array = Uint8Array;\nexport const dataView = DataView;\n\nexport const reserved = \"reserved\";\nexport const bad = \"bad\";\nexport const free = \"free\";\nexport const none = \"none\";\nexport const sixteenBitCRC = \"16bit CRC\";\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { length, uint8Array } from \"./constants.js\";\n\nconst getCrcTable = (crcTable, crcInitialValueFunction, crcFunction) => {\n for (let byte = 0; byte < crcTable[length]; byte++) {\n let crc = crcInitialValueFunction(byte);\n\n for (let bit = 8; bit > 0; bit--) crc = crcFunction(crc);\n\n crcTable[byte] = crc;\n }\n return crcTable;\n};\n\nconst crc8Table = getCrcTable(\n new uint8Array(256),\n (b) => b,\n (crc) => (crc & 0x80 ? 0x07 ^ (crc << 1) : crc << 1),\n);\n\nconst flacCrc16Table = [\n getCrcTable(\n new Uint16Array(256),\n (b) => b << 8,\n (crc) => (crc << 1) ^ (crc & (1 << 15) ? 0x8005 : 0),\n ),\n];\n\nconst crc32Table = [\n getCrcTable(\n new Uint32Array(256),\n (b) => b,\n (crc) => (crc >>> 1) ^ ((crc & 1) * 0xedb88320),\n ),\n];\n\n// build crc tables\nfor (let i = 0; i < 15; i++) {\n flacCrc16Table.push(new Uint16Array(256));\n crc32Table.push(new Uint32Array(256));\n\n for (let j = 0; j <= 0xff; j++) {\n flacCrc16Table[i + 1][j] =\n flacCrc16Table[0][flacCrc16Table[i][j] >>> 8] ^\n (flacCrc16Table[i][j] << 8);\n\n crc32Table[i + 1][j] =\n (crc32Table[i][j] >>> 8) ^ crc32Table[0][crc32Table[i][j] & 0xff];\n }\n}\n\nconst crc8 = (data) => {\n let crc = 0;\n const dataLength = data[length];\n\n for (let i = 0; i !== dataLength; i++) crc = crc8Table[crc ^ data[i]];\n\n return crc;\n};\n\nconst flacCrc16 = (data) => {\n const dataLength = data[length];\n const crcChunkSize = dataLength - 16;\n let crc = 0;\n let i = 0;\n\n while (i <= crcChunkSize) {\n crc ^= (data[i++] << 8) | data[i++];\n crc =\n flacCrc16Table[15][crc >> 8] ^\n flacCrc16Table[14][crc & 0xff] ^\n flacCrc16Table[13][data[i++]] ^\n flacCrc16Table[12][data[i++]] ^\n flacCrc16Table[11][data[i++]] ^\n flacCrc16Table[10][data[i++]] ^\n flacCrc16Table[9][data[i++]] ^\n flacCrc16Table[8][data[i++]] ^\n flacCrc16Table[7][data[i++]] ^\n flacCrc16Table[6][data[i++]] ^\n flacCrc16Table[5][data[i++]] ^\n flacCrc16Table[4][data[i++]] ^\n flacCrc16Table[3][data[i++]] ^\n flacCrc16Table[2][data[i++]] ^\n flacCrc16Table[1][data[i++]] ^\n flacCrc16Table[0][data[i++]];\n }\n\n while (i !== dataLength)\n crc = ((crc & 0xff) << 8) ^ flacCrc16Table[0][(crc >> 8) ^ data[i++]];\n\n return crc;\n};\n\nconst crc32Function = (data) => {\n const dataLength = data[length];\n const crcChunkSize = dataLength - 16;\n let crc = 0;\n let i = 0;\n\n while (i <= crcChunkSize)\n crc =\n crc32Table[15][(data[i++] ^ crc) & 0xff] ^\n crc32Table[14][(data[i++] ^ (crc >>> 8)) & 0xff] ^\n crc32Table[13][(data[i++] ^ (crc >>> 16)) & 0xff] ^\n crc32Table[12][data[i++] ^ (crc >>> 24)] ^\n crc32Table[11][data[i++]] ^\n crc32Table[10][data[i++]] ^\n crc32Table[9][data[i++]] ^\n crc32Table[8][data[i++]] ^\n crc32Table[7][data[i++]] ^\n crc32Table[6][data[i++]] ^\n crc32Table[5][data[i++]] ^\n crc32Table[4][data[i++]] ^\n crc32Table[3][data[i++]] ^\n crc32Table[2][data[i++]] ^\n crc32Table[1][data[i++]] ^\n crc32Table[0][data[i++]];\n\n while (i !== dataLength)\n crc = crc32Table[0][(crc ^ data[i++]) & 0xff] ^ (crc >>> 8);\n\n return crc ^ -1;\n};\n\nconst concatBuffers = (...buffers) => {\n const buffer = new uint8Array(\n buffers.reduce((acc, buf) => acc + buf[length], 0),\n );\n\n buffers.reduce((offset, buf) => {\n buffer.set(buf, offset);\n return offset + buf[length];\n }, 0);\n\n return buffer;\n};\n\nconst bytesToString = (bytes) => String.fromCharCode(...bytes);\n\n// prettier-ignore\nconst reverseTable = [0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf];\nconst reverse = (val) =>\n (reverseTable[val & 0b1111] << 4) | reverseTable[val >> 4];\n\nclass BitReader {\n constructor(data) {\n this._data = data;\n this._pos = data[length] * 8;\n }\n\n set position(position) {\n this._pos = position;\n }\n\n get position() {\n return this._pos;\n }\n\n read(bits) {\n const byte = Math.floor(this._pos / 8);\n const bit = this._pos % 8;\n this._pos -= bits;\n\n const window =\n (reverse(this._data[byte - 1]) << 8) + reverse(this._data[byte]);\n\n return (window >> (7 - bit)) & 0xff;\n }\n}\n\n/**\n * @todo Old versions of Safari do not support BigInt\n */\nconst readInt64le = (view, offset) => {\n try {\n return view.getBigInt64(offset, true);\n } catch {\n const sign = view.getUint8(offset + 7) & 0x80 ? -1 : 1;\n let firstPart = view.getUint32(offset, true);\n let secondPart = view.getUint32(offset + 4, true);\n\n if (sign === -1) {\n firstPart = ~firstPart + 1;\n secondPart = ~secondPart + 1;\n }\n\n if (secondPart > 0x000fffff) {\n console.warn(\"This platform does not support BigInt\");\n }\n\n return sign * (firstPart + secondPart * 2 ** 32);\n }\n};\n\nexport {\n crc8,\n flacCrc16,\n crc32Function,\n reverse,\n concatBuffers,\n bytesToString,\n readInt64le,\n BitReader,\n};\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport {\n getHeader,\n setHeader,\n checkCodecUpdate,\n reset,\n enable,\n} from \"../constants.js\";\n\nexport default class HeaderCache {\n constructor(onCodecHeader, onCodecUpdate) {\n this._onCodecHeader = onCodecHeader;\n this._onCodecUpdate = onCodecUpdate;\n this[reset]();\n }\n\n [enable]() {\n this._isEnabled = true;\n }\n\n [reset]() {\n this._headerCache = new Map();\n this._codecUpdateData = new WeakMap();\n this._codecHeaderSent = false;\n this._codecShouldUpdate = false;\n this._bitrate = null;\n this._isEnabled = false;\n }\n\n [checkCodecUpdate](bitrate, totalDuration) {\n if (this._onCodecUpdate) {\n if (this._bitrate !== bitrate) {\n this._bitrate = bitrate;\n this._codecShouldUpdate = true;\n }\n\n // only update if codec data is available\n const codecData = this._codecUpdateData.get(\n this._headerCache.get(this._currentHeader),\n );\n\n if (this._codecShouldUpdate && codecData) {\n this._onCodecUpdate(\n {\n bitrate,\n ...codecData,\n },\n totalDuration,\n );\n }\n\n this._codecShouldUpdate = false;\n }\n }\n\n [getHeader](key) {\n const header = this._headerCache.get(key);\n\n if (header) {\n this._updateCurrentHeader(key);\n }\n\n return header;\n }\n\n [setHeader](key, header, codecUpdateFields) {\n if (this._isEnabled) {\n if (!this._codecHeaderSent) {\n this._onCodecHeader({ ...header });\n this._codecHeaderSent = true;\n }\n this._updateCurrentHeader(key);\n\n this._headerCache.set(key, header);\n this._codecUpdateData.set(header, codecUpdateFields);\n }\n }\n\n _updateCurrentHeader(key) {\n if (this._onCodecUpdate && key !== this._currentHeader) {\n this._codecShouldUpdate = true;\n this._currentHeader = key;\n }\n }\n}\n","export const headerStore = new WeakMap();\nexport const frameStore = new WeakMap();\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { frameStore } from \"../globals.js\";\nimport {\n frame,\n length,\n incrementRawData,\n mapFrameStats,\n logWarning,\n syncFrame,\n fixedLengthFrameSync,\n getFrame,\n getHeader,\n reset,\n enable,\n} from \"../constants.js\";\n\n/**\n * @abstract\n * @description Abstract class containing methods for parsing codec frames\n */\nexport default class Parser {\n constructor(codecParser, headerCache) {\n this._codecParser = codecParser;\n this._headerCache = headerCache;\n }\n\n *[syncFrame]() {\n let frameData;\n\n do {\n frameData = yield* this.Frame[getFrame](\n this._codecParser,\n this._headerCache,\n 0,\n );\n if (frameData) return frameData;\n this._codecParser[incrementRawData](1); // increment to continue syncing\n } while (true);\n }\n\n /**\n * @description Searches for Frames within bytes containing a sequence of known codec frames.\n * @param {boolean} ignoreNextFrame Set to true to return frames even if the next frame may not exist at the expected location\n * @returns {Frame}\n */\n *[fixedLengthFrameSync](ignoreNextFrame) {\n let frameData = yield* this[syncFrame]();\n const frameLength = frameStore.get(frameData)[length];\n\n if (\n ignoreNextFrame ||\n this._codecParser._flushing ||\n // check if there is a frame right after this one\n (yield* this.Header[getHeader](\n this._codecParser,\n this._headerCache,\n frameLength,\n ))\n ) {\n this._headerCache[enable](); // start caching when synced\n\n this._codecParser[incrementRawData](frameLength); // increment to the next frame\n this._codecParser[mapFrameStats](frameData);\n return frameData;\n }\n\n this._codecParser[logWarning](\n `Missing ${frame} at ${frameLength} bytes from current position.`,\n `Dropping current ${frame} and trying again.`,\n );\n this._headerCache[reset](); // frame is invalid and must re-sync and clear cache\n this._codecParser[incrementRawData](1); // increment to invalidate the current frame\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { frameStore } from \"../globals.js\";\nimport { data, header } from \"../constants.js\";\n\n/**\n * @abstract\n */\nexport default class Frame {\n constructor(headerValue, dataValue) {\n frameStore.set(this, { [header]: headerValue });\n\n this[data] = dataValue;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { frameStore, headerStore } from \"../globals.js\";\nimport {\n sampleRate,\n length,\n frameNumber,\n header,\n samples,\n duration,\n totalBytesOut,\n totalSamples,\n totalDuration,\n frameLength,\n subarray,\n readRawData,\n getFrame,\n getHeader,\n} from \"../constants.js\";\nimport Frame from \"../containers/Frame.js\";\n\nexport default class CodecFrame extends Frame {\n static *[getFrame](Header, Frame, codecParser, headerCache, readOffset) {\n const headerValue = yield* Header[getHeader](\n codecParser,\n headerCache,\n readOffset,\n );\n\n if (headerValue) {\n const frameLengthValue = headerStore.get(headerValue)[frameLength];\n const samplesValue = headerStore.get(headerValue)[samples];\n\n const frame = (yield* codecParser[readRawData](\n frameLengthValue,\n readOffset,\n ))[subarray](0, frameLengthValue);\n\n return new Frame(headerValue, frame, samplesValue);\n } else {\n return null;\n }\n }\n\n constructor(headerValue, dataValue, samplesValue) {\n super(headerValue, dataValue);\n\n this[header] = headerValue;\n this[samples] = samplesValue;\n this[duration] = (samplesValue / headerValue[sampleRate]) * 1000;\n this[frameNumber] = null;\n this[totalBytesOut] = null;\n this[totalSamples] = null;\n this[totalDuration] = null;\n\n frameStore.get(this)[length] = dataValue[length];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\n// https://id3.org/Developer%20Information\n\nimport { length, version, readRawData } from \"../constants.js\";\n\nconst unsynchronizationFlag = \"unsynchronizationFlag\";\nconst extendedHeaderFlag = \"extendedHeaderFlag\";\nconst experimentalFlag = \"experimentalFlag\";\nconst footerPresent = \"footerPresent\";\n\nexport default class ID3v2 {\n static *getID3v2Header(codecParser, headerCache, readOffset) {\n const headerLength = 10;\n const header = {};\n\n let data = yield* codecParser[readRawData](3, readOffset);\n // Byte (0-2 of 9)\n // ID3\n if (data[0] !== 0x49 || data[1] !== 0x44 || data[2] !== 0x33) return null;\n\n data = yield* codecParser[readRawData](headerLength, readOffset);\n\n // Byte (3-4 of 9)\n // * `BBBBBBBB|........`: Major version\n // * `........|BBBBBBBB`: Minor version\n header[version] = `id3v2.${data[3]}.${data[4]}`;\n\n // Byte (5 of 9)\n // * `....0000.: Zeros (flags not implemented yet)\n if (data[5] & 0b00001111) return null;\n\n // Byte (5 of 9)\n // * `CDEF0000`: Flags\n // * `C.......`: Unsynchronisation (indicates whether or not unsynchronisation is used)\n // * `.D......`: Extended header (indicates whether or not the header is followed by an extended header)\n // * `..E.....`: Experimental indicator (indicates whether or not the tag is in an experimental stage)\n // * `...F....`: Footer present (indicates that a footer is present at the very end of the tag)\n header[unsynchronizationFlag] = !!(data[5] & 0b10000000);\n header[extendedHeaderFlag] = !!(data[5] & 0b01000000);\n header[experimentalFlag] = !!(data[5] & 0b00100000);\n header[footerPresent] = !!(data[5] & 0b00010000);\n\n // Byte (6-9 of 9)\n // * `0.......|0.......|0.......|0.......`: Zeros\n if (\n data[6] & 0b10000000 ||\n data[7] & 0b10000000 ||\n data[8] & 0b10000000 ||\n data[9] & 0b10000000\n )\n return null;\n\n // Byte (6-9 of 9)\n // * `.FFFFFFF|.FFFFFFF|.FFFFFFF|.FFFFFFF`: Tag Length\n // The ID3v2 tag size is encoded with four bytes where the most significant bit (bit 7)\n // is set to zero in every byte, making a total of 28 bits. The zeroed bits are ignored,\n // so a 257 bytes long tag is represented as $00 00 02 01.\n const dataLength =\n (data[6] << 21) | (data[7] << 14) | (data[8] << 7) | data[9];\n\n header[length] = headerLength + dataLength;\n\n return new ID3v2(header);\n }\n\n constructor(header) {\n this[version] = header[version];\n this[unsynchronizationFlag] = header[unsynchronizationFlag];\n this[extendedHeaderFlag] = header[extendedHeaderFlag];\n this[experimentalFlag] = header[experimentalFlag];\n this[footerPresent] = header[footerPresent];\n this[length] = header[length];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { headerStore } from \"../globals.js\";\nimport {\n bitDepth,\n channelMode,\n sampleRate,\n bitrate,\n channels,\n} from \"../constants.js\";\n\nexport default class CodecHeader {\n /**\n * @private\n */\n constructor(header) {\n headerStore.set(this, header);\n\n this[bitDepth] = header[bitDepth];\n this[bitrate] = null; // set during frame mapping\n this[channels] = header[channels];\n this[channelMode] = header[channelMode];\n this[sampleRate] = header[sampleRate];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport {\n reserved,\n bad,\n free,\n none,\n sixteenBitCRC,\n rate44100,\n rate48000,\n rate32000,\n rate22050,\n rate24000,\n rate16000,\n rate11025,\n rate12000,\n rate8000,\n monophonic,\n stereo,\n bitDepth,\n channelMode,\n sampleRate,\n bitrate,\n channels,\n isOriginal,\n isPrivate,\n layer,\n length,\n mpegVersion,\n frameLength,\n protection,\n emphasis,\n framePadding,\n isCopyrighted,\n modeExtension,\n description,\n samples,\n subarray,\n readRawData,\n incrementRawData,\n getHeader,\n setHeader,\n} from \"../../constants.js\";\nimport { bytesToString } from \"../../utilities.js\";\n\nimport ID3v2 from \"../../metadata/ID3v2.js\";\nimport CodecHeader from \"../CodecHeader.js\";\n\n// http://www.mp3-tech.org/programmer/frame_header.html\n\nconst bitrateMatrix = {\n // bits | V1,L1 | V1,L2 | V1,L3 | V2,L1 | V2,L2 & L3\n 0b00000000: [free, free, free, free, free],\n 0b00010000: [32, 32, 32, 32, 8],\n // 0b00100000: [64, 48, 40, 48, 16,],\n // 0b00110000: [96, 56, 48, 56, 24,],\n // 0b01000000: [128, 64, 56, 64, 32,],\n // 0b01010000: [160, 80, 64, 80, 40,],\n // 0b01100000: [192, 96, 80, 96, 48,],\n // 0b01110000: [224, 112, 96, 112, 56,],\n // 0b10000000: [256, 128, 112, 128, 64,],\n // 0b10010000: [288, 160, 128, 144, 80,],\n // 0b10100000: [320, 192, 160, 160, 96,],\n // 0b10110000: [352, 224, 192, 176, 112,],\n // 0b11000000: [384, 256, 224, 192, 128,],\n // 0b11010000: [416, 320, 256, 224, 144,],\n // 0b11100000: [448, 384, 320, 256, 160,],\n 0b11110000: [bad, bad, bad, bad, bad],\n};\n\nconst calcBitrate = (idx, interval, intervalOffset) =>\n 8 *\n (((idx + intervalOffset) % interval) + interval) *\n (1 << ((idx + intervalOffset) / interval)) -\n 8 * interval * ((interval / 8) | 0);\n\n// generate bitrate matrix\nfor (let i = 2; i < 15; i++)\n bitrateMatrix[i << 4] = [\n i * 32, // V1,L1\n calcBitrate(i, 4, 0), // V1,L2\n calcBitrate(i, 4, -1), // V1,L3\n calcBitrate(i, 8, 4), // V2,L1\n calcBitrate(i, 8, 0), // V2,L2 & L3\n ];\n\nconst v1Layer1 = 0;\nconst v1Layer2 = 1;\nconst v1Layer3 = 2;\nconst v2Layer1 = 3;\nconst v2Layer23 = 4;\n\nconst bands = \"bands \";\nconst to31 = \" to 31\";\nconst layer12ModeExtensions = {\n 0b00000000: bands + 4 + to31,\n 0b00010000: bands + 8 + to31,\n 0b00100000: bands + 12 + to31,\n 0b00110000: bands + 16 + to31,\n};\n\nconst bitrateIndex = \"bitrateIndex\";\nconst v2 = \"v2\";\nconst v1 = \"v1\";\n\nconst intensityStereo = \"Intensity stereo \";\nconst msStereo = \", MS stereo \";\nconst on = \"on\";\nconst off = \"off\";\nconst layer3ModeExtensions = {\n 0b00000000: intensityStereo + off + msStereo + off,\n 0b00010000: intensityStereo + on + msStereo + off,\n 0b00100000: intensityStereo + off + msStereo + on,\n 0b00110000: intensityStereo + on + msStereo + on,\n};\n\nconst layersValues = {\n 0b00000000: { [description]: reserved },\n 0b00000010: {\n [description]: \"Layer III\",\n [framePadding]: 1,\n [modeExtension]: layer3ModeExtensions,\n [v1]: {\n [bitrateIndex]: v1Layer3,\n [samples]: 1152,\n },\n [v2]: {\n [bitrateIndex]: v2Layer23,\n [samples]: 576,\n },\n },\n 0b00000100: {\n [description]: \"Layer II\",\n [framePadding]: 1,\n [modeExtension]: layer12ModeExtensions,\n [samples]: 1152,\n [v1]: {\n [bitrateIndex]: v1Layer2,\n },\n [v2]: {\n [bitrateIndex]: v2Layer23,\n },\n },\n 0b00000110: {\n [description]: \"Layer I\",\n [framePadding]: 4,\n [modeExtension]: layer12ModeExtensions,\n [samples]: 384,\n [v1]: {\n [bitrateIndex]: v1Layer1,\n },\n [v2]: {\n [bitrateIndex]: v2Layer1,\n },\n },\n};\n\nconst mpegVersionDescription = \"MPEG Version \";\nconst isoIec = \"ISO/IEC \";\nconst mpegVersions = {\n 0b00000000: {\n [description]: `${mpegVersionDescription}2.5 (later extension of MPEG 2)`,\n [layer]: v2,\n [sampleRate]: {\n 0b00000000: rate11025,\n 0b00000100: rate12000,\n 0b00001000: rate8000,\n 0b00001100: reserved,\n },\n },\n 0b00001000: { [description]: reserved },\n 0b00010000: {\n [description]: `${mpegVersionDescription}2 (${isoIec}13818-3)`,\n [layer]: v2,\n [sampleRate]: {\n 0b00000000: rate22050,\n 0b00000100: rate24000,\n 0b00001000: rate16000,\n 0b00001100: reserved,\n },\n },\n 0b00011000: {\n [description]: `${mpegVersionDescription}1 (${isoIec}11172-3)`,\n [layer]: v1,\n [sampleRate]: {\n 0b00000000: rate44100,\n 0b00000100: rate48000,\n 0b00001000: rate32000,\n 0b00001100: reserved,\n },\n },\n length,\n};\n\nconst protectionValues = {\n 0b00000000: sixteenBitCRC,\n 0b00000001: none,\n};\n\nconst emphasisValues = {\n 0b00000000: none,\n 0b00000001: \"50/15 ms\",\n 0b00000010: reserved,\n 0b00000011: \"CCIT J.17\",\n};\n\nconst channelModes = {\n 0b00000000: { [channels]: 2, [description]: stereo },\n 0b01000000: { [channels]: 2, [description]: \"joint \" + stereo },\n 0b10000000: { [channels]: 2, [description]: \"dual channel\" },\n 0b11000000: { [channels]: 1, [description]: monophonic },\n};\n\nexport default class MPEGHeader extends CodecHeader {\n static *[getHeader](codecParser, headerCache, readOffset) {\n const header = {};\n\n // check for id3 header\n const id3v2Header = yield* ID3v2.getID3v2Header(\n codecParser,\n headerCache,\n readOffset,\n );\n\n if (id3v2Header) {\n // throw away the data. id3 parsing is not implemented yet.\n yield* codecParser[readRawData](id3v2Header[length], readOffset);\n codecParser[incrementRawData](id3v2Header[length]);\n }\n\n // Must be at least four bytes.\n const data = yield* codecParser[readRawData](4, readOffset);\n\n // Check header cache\n const key = bytesToString(data[subarray](0, 4));\n const cachedHeader = headerCache[getHeader](key);\n if (cachedHeader) return new MPEGHeader(cachedHeader);\n\n // Frame sync (all bits must be set): `11111111|111`:\n if (data[0] !== 0xff || data[1] < 0xe0) return null;\n\n // Byte (2 of 4)\n // * `111BBCCD`\n // * `...BB...`: MPEG Audio version ID\n // * `.....CC.`: Layer description\n // * `.......D`: Protection bit (0 - Protected by CRC (16bit CRC follows header), 1 = Not protected)\n\n // Mpeg version (1, 2, 2.5)\n const mpegVersionValues = mpegVersions[data[1] & 0b00011000];\n if (mpegVersionValues[description] === reserved) return null;\n\n // Layer (I, II, III)\n const layerBits = data[1] & 0b00000110;\n if (layersValues[layerBits][description] === reserved) return null;\n const layerValues = {\n ...layersValues[layerBits],\n ...layersValues[layerBits][mpegVersionValues[layer]],\n };\n\n header[mpegVersion] = mpegVersionValues[description];\n header[layer] = layerValues[description];\n header[samples] = layerValues[samples];\n header[protection] = protectionValues[data[1] & 0b00000001];\n\n header[length] = 4;\n\n // Byte (3 of 4)\n // * `EEEEFFGH`\n // * `EEEE....`: Bitrate index. 1111 is invalid, everything else is accepted\n // * `....FF..`: Sample rate\n // * `......G.`: Padding bit, 0=frame not padded, 1=frame padded\n // * `.......H`: Private bit.\n header[bitrate] =\n bitrateMatrix[data[2] & 0b11110000][layerValues[bitrateIndex]];\n if (header[bitrate] === bad) return null;\n\n header[sampleRate] = mpegVersionValues[sampleRate][data[2] & 0b00001100];\n if (header[sampleRate] === reserved) return null;\n\n header[framePadding] = data[2] & 0b00000010 && layerValues[framePadding];\n header[isPrivate] = !!(data[2] & 0b00000001);\n\n header[frameLength] = Math.floor(\n (125 * header[bitrate] * header[samples]) / header[sampleRate] +\n header[framePadding],\n );\n if (!header[frameLength]) return null;\n\n // Byte (4 of 4)\n // * `IIJJKLMM`\n // * `II......`: Channel mode\n // * `..JJ....`: Mode extension (only if joint stereo)\n // * `....K...`: Copyright\n // * `.....L..`: Original\n // * `......MM`: Emphasis\n const channelModeBits = data[3] & 0b11000000;\n header[channelMode] = channelModes[channelModeBits][description];\n header[channels] = channelModes[channelModeBits][channels];\n\n header[modeExtension] = layerValues[modeExtension][data[3] & 0b00110000];\n header[isCopyrighted] = !!(data[3] & 0b00001000);\n header[isOriginal] = !!(data[3] & 0b00000100);\n\n header[emphasis] = emphasisValues[data[3] & 0b00000011];\n if (header[emphasis] === reserved) return null;\n\n header[bitDepth] = 16;\n\n // set header cache\n {\n const { length, frameLength, samples, ...codecUpdateFields } = header;\n\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n return new MPEGHeader(header);\n }\n\n /**\n * @private\n * Call MPEGHeader.getHeader(Array<Uint8>) to get instance\n */\n constructor(header) {\n super(header);\n\n this[bitrate] = header[bitrate];\n this[emphasis] = header[emphasis];\n this[framePadding] = header[framePadding];\n this[isCopyrighted] = header[isCopyrighted];\n this[isOriginal] = header[isOriginal];\n this[isPrivate] = header[isPrivate];\n this[layer] = header[layer];\n this[modeExtension] = header[modeExtension];\n this[mpegVersion] = header[mpegVersion];\n this[protection] = header[protection];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { getFrame } from \"../../constants.js\";\n\nimport CodecFrame from \"../CodecFrame.js\";\nimport MPEGHeader from \"./MPEGHeader.js\";\n\nexport default class MPEGFrame extends CodecFrame {\n static *[getFrame](codecParser, headerCache, readOffset) {\n return yield* super[getFrame](\n MPEGHeader,\n MPEGFrame,\n codecParser,\n headerCache,\n readOffset,\n );\n }\n\n constructor(header, frame, samples) {\n super(header, frame, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport {\n codec,\n mpeg,\n fixedLengthFrameSync,\n parseFrame,\n} from \"../../constants.js\";\n\nimport Parser from \"../Parser.js\";\nimport MPEGFrame from \"./MPEGFrame.js\";\nimport MPEGHeader from \"./MPEGHeader.js\";\n\nexport default class MPEGParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = MPEGFrame;\n this.Header = MPEGHeader;\n\n onCodec(this[codec]);\n }\n\n get [codec]() {\n return mpeg;\n }\n\n *[parseFrame]() {\n return yield* this[fixedLengthFrameSync]();\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\n/*\nhttps://wiki.multimedia.cx/index.php/ADTS\n\nAAAAAAAA AAAABCCD EEFFFFGH HHIJKLMM MMMMMMMM MMMOOOOO OOOOOOPP (QQQQQQQQ QQQQQQQQ)\n\nAACHeader consists of 7 or 9 bytes (without or with CRC).\nLetter Length (bits) Description\nA 12 syncword 0xFFF, all bits must be 1\nB 1 MPEG Version: 0 for MPEG-4, 1 for MPEG-2\nC 2 Layer: always 0\nD 1 protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC\nE 2 profile, the MPEG-4 Audio Object Type minus 1\nF 4 MPEG-4 Sampling Frequency Index (15 is forbidden)\nG 1 private bit, guaranteed never to be used by MPEG, set to 0 when encoding, ignore when decoding\nH 3 MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)\nI 1 originality, set to 0 when encoding, ignore when decoding\nJ 1 home, set to 0 when encoding, ignore when decoding\nK 1 copyrighted id bit, the next bit of a centrally registered copyright identifier, set to 0 when encoding, ignore when decoding\nL 1 copyright id start, signals that this frame's copyright id bit is the first bit of the copyright id, set to 0 when encoding, ignore when decoding\nM 13 frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)\nO 11 Buffer fullness // 0x7FF for VBR\nP 2 Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame\nQ 16 CRC if protection absent is 0 \n*/\n\nimport { headerStore } from \"../../globals.js\";\nimport { bytesToString } from \"../../utilities.js\";\nimport {\n reserved,\n bad,\n none,\n sixteenBitCRC,\n rate96000,\n rate88200,\n rate64000,\n rate48000,\n rate44100,\n rate32000,\n rate24000,\n rate22050,\n rate16000,\n rate12000,\n rate11025,\n rate8000,\n rate7350,\n channelMappings,\n getChannelMapping,\n monophonic,\n lfe,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n copyrightId,\n copyrightIdStart,\n bufferFullness,\n isHome,\n isOriginal,\n isPrivate,\n layer,\n length,\n mpegVersion,\n numberAACFrames,\n profile,\n protection,\n frameLength,\n description,\n samples,\n sampleRateBits,\n profileBits,\n channelModeBits,\n buffer,\n readRawData,\n getHeader,\n setHeader,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\n\nimport CodecHeader from \"../CodecHeader.js\";\n\nconst mpegVersionValues = {\n 0b00000000: \"MPEG-4\",\n 0b00001000: \"MPEG-2\",\n};\n\nconst layerValues = {\n 0b00000000: \"valid\",\n 0b00000010: bad,\n 0b00000100: bad,\n 0b00000110: bad,\n};\n\nconst protectionValues = {\n 0b00000000: sixteenBitCRC,\n 0b00000001: none,\n};\n\nconst profileValues = {\n 0b00000000: \"AAC Main\",\n 0b01000000: \"AAC LC (Low Complexity)\",\n 0b10000000: \"AAC SSR (Scalable Sample Rate)\",\n 0b11000000: \"AAC LTP (Long Term Prediction)\",\n};\n\nconst sampleRates = {\n 0b00000000: rate96000,\n 0b00000100: rate88200,\n 0b00001000: rate64000,\n 0b00001100: rate48000,\n 0b00010000: rate44100,\n 0b00010100: rate32000,\n 0b00011000: rate24000,\n 0b00011100: rate22050,\n 0b00100000: rate16000,\n 0b00100100: rate12000,\n 0b00101000: rate11025,\n 0b00101100: rate8000,\n 0b00110000: rate7350,\n 0b00110100: reserved,\n 0b00111000: reserved,\n 0b00111100: \"frequency is written explicitly\",\n};\n\n// prettier-ignore\nconst channelModeValues = {\n 0b000000000: { [channels]: 0, [description]: \"Defined in AOT Specific Config\" },\n /*\n 'monophonic (mono)'\n 'stereo (left, right)'\n 'linear surround (front center, front left, front right)'\n 'quadraphonic (front center, front left, front right, rear center)'\n '5.0 surround (front center, front left, front right, rear left, rear right)'\n '5.1 surround (front center, front left, front right, rear left, rear right, LFE)'\n '7.1 surround (front center, front left, front right, side left, side right, rear left, rear right, LFE)'\n */\n 0b001000000: { [channels]: 1, [description]: monophonic },\n 0b010000000: { [channels]: 2, [description]: getChannelMapping(2,channelMappings[0][0]) },\n 0b011000000: { [channels]: 3, [description]: getChannelMapping(3,channelMappings[1][3]), },\n 0b100000000: { [channels]: 4, [description]: getChannelMapping(4,channelMappings[1][3],channelMappings[3][4]), },\n 0b101000000: { [channels]: 5, [description]: getChannelMapping(5,channelMappings[1][3],channelMappings[3][0]), },\n 0b110000000: { [channels]: 6, [description]: getChannelMapping(6,channelMappings[1][3],channelMappings[3][0],lfe), },\n 0b111000000: { [channels]: 8, [description]: getChannelMapping(8,channelMappings[1][3],channelMappings[2][0],channelMappings[3][0],lfe), },\n};\n\nexport default class AACHeader extends CodecHeader {\n static *[getHeader](codecParser, headerCache, readOffset) {\n const header = {};\n\n // Must be at least seven bytes. Out of data\n const data = yield* codecParser[readRawData](7, readOffset);\n\n // Check header cache\n const key = bytesToString([\n data[0],\n data[1],\n data[2],\n (data[3] & 0b11111100) | (data[6] & 0b00000011), // frame length, buffer fullness varies so don't cache it\n ]);\n const cachedHeader = headerCache[getHeader](key);\n\n if (!cachedHeader) {\n // Frame sync (all bits must be set): `11111111|1111`:\n if (data[0] !== 0xff || data[1] < 0xf0) return null;\n\n // Byte (2 of 7)\n // * `1111BCCD`\n // * `....B...`: MPEG Version: 0 for MPEG-4, 1 for MPEG-2\n // * `.....CC.`: Layer: always 0\n // * `.......D`: protection absent, Warning, set to 1 if there is no CRC and 0 if there is CRC\n header[mpegVersion] = mpegVersionValues[data[1] & 0b00001000];\n\n header[layer] = layerValues[data[1] & 0b00000110];\n if (header[layer] === bad) return null;\n\n const protectionBit = data[1] & 0b00000001;\n header[protection] = protectionValues[protectionBit];\n header[length] = protectionBit ? 7 : 9;\n\n // Byte (3 of 7)\n // * `EEFFFFGH`\n // * `EE......`: profile, the MPEG-4 Audio Object Type minus 1\n // * `..FFFF..`: MPEG-4 Sampling Frequency Index (15 is forbidden)\n // * `......G.`: private bit, guaranteed never to be used by MPEG, set to 0 when encoding, ignore when decoding\n header[profileBits] = data[2] & 0b11000000;\n header[sampleRateBits] = data[2] & 0b00111100;\n const privateBit = data[2] & 0b00000010;\n\n header[profile] = profileValues[header[profileBits]];\n\n header[sampleRate] = sampleRates[header[sampleRateBits]];\n if (header[sampleRate] === reserved) return null;\n\n header[isPrivate] = !!privateBit;\n\n // Byte (3,4 of 7)\n // * `.......H|HH......`: MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE)\n header[channelModeBits] = ((data[2] << 8) | data[3]) & 0b111000000;\n header[channelMode] =\n channelModeValues[header[channelModeBits]][description];\n header[channels] = channelModeValues[header[channelModeBits]][channels];\n\n // Byte (4 of 7)\n // * `HHIJKLMM`\n // * `..I.....`: originality, set to 0 when encoding, ignore when decoding\n // * `...J....`: home, set to 0 when encoding, ignore when decoding\n // * `....K...`: copyrighted id bit, the next bit of a centrally registered copyright identifier, set to 0 when encoding, ignore when decoding\n // * `.....L..`: copyright id start, signals that this frame's copyright id bit is the first bit of the copyright id, set to 0 when encoding, ignore when decoding\n header[isOriginal] = !!(data[3] & 0b00100000);\n header[isHome] = !!(data[3] & 0b00001000);\n header[copyrightId] = !!(data[3] & 0b00001000);\n header[copyrightIdStart] = !!(data[3] & 0b00000100);\n header[bitDepth] = 16;\n header[samples] = 1024;\n\n // Byte (7 of 7)\n // * `......PP` Number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame\n header[numberAACFrames] = data[6] & 0b00000011;\n\n {\n const {\n length,\n channelModeBits,\n profileBits,\n sampleRateBits,\n frameLength,\n samples,\n numberAACFrames,\n ...codecUpdateFields\n } = header;\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n } else {\n Object.assign(header, cachedHeader);\n }\n\n // Byte (4,5,6 of 7)\n // * `.......MM|MMMMMMMM|MMM.....`: frame length, this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame)\n header[frameLength] =\n ((data[3] << 11) | (data[4] << 3) | (data[5] >> 5)) & 0x1fff;\n if (!header[frameLength]) return null;\n\n // Byte (6,7 of 7)\n // * `...OOOOO|OOOOOO..`: Buffer fullness\n const bufferFullnessBits = ((data[5] << 6) | (data[6] >> 2)) & 0x7ff;\n header[bufferFullness] =\n bufferFullnessBits === 0x7ff ? \"VBR\" : bufferFullnessBits;\n\n return new AACHeader(header);\n }\n\n /**\n * @private\n * Call AACHeader.getHeader(Array<Uint8>) to get instance\n */\n constructor(header) {\n super(header);\n\n this[copyrightId] = header[copyrightId];\n this[copyrightIdStart] = header[copyrightIdStart];\n this[bufferFullness] = header[bufferFullness];\n this[isHome] = header[isHome];\n this[isOriginal] = header[isOriginal];\n this[isPrivate] = header[isPrivate];\n this[layer] = header[layer];\n this[length] = header[length];\n this[mpegVersion] = header[mpegVersion];\n this[numberAACFrames] = header[numberAACFrames];\n this[profile] = header[profile];\n this[protection] = header[protection];\n }\n\n get audioSpecificConfig() {\n // Audio Specific Configuration\n // * `000EEFFF|F0HHH000`:\n // * `000EE...|........`: Object Type (profileBit + 1)\n // * `.....FFF|F.......`: Sample Rate\n // * `........|.0HHH...`: Channel Configuration\n // * `........|.....0..`: Frame Length (1024)\n // * `........|......0.`: does not depend on core coder\n // * `........|.......0`: Not Extension\n const header = headerStore.get(this);\n\n const audioSpecificConfig =\n ((header[profileBits] + 0x40) << 5) |\n (header[sampleRateBits] << 5) |\n (header[channelModeBits] >> 3);\n\n const bytes = new uint8Array(2);\n new dataView(bytes[buffer]).setUint16(0, audioSpecificConfig, false);\n return bytes;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { getFrame } from \"../../constants.js\";\n\nimport CodecFrame from \"../CodecFrame.js\";\nimport AACHeader from \"./AACHeader.js\";\n\nexport default class AACFrame extends CodecFrame {\n static *[getFrame](codecParser, headerCache, readOffset) {\n return yield* super[getFrame](\n AACHeader,\n AACFrame,\n codecParser,\n headerCache,\n readOffset,\n );\n }\n\n constructor(header, frame, samples) {\n super(header, frame, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { codec, fixedLengthFrameSync, parseFrame } from \"../../constants.js\";\n\nimport Parser from \"../Parser.js\";\nimport AACFrame from \"./AACFrame.js\";\nimport AACHeader from \"./AACHeader.js\";\n\nexport default class AACParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = AACFrame;\n this.Header = AACHeader;\n\n onCodec(this[codec]);\n }\n\n get [codec]() {\n return \"aac\";\n }\n\n *[parseFrame]() {\n return yield* this[fixedLengthFrameSync]();\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { headerStore } from \"../../globals.js\";\nimport { flacCrc16 } from \"../../utilities.js\";\nimport {\n length,\n streamInfo,\n crc16,\n samples,\n subarray,\n checkFrameFooterCrc16,\n} from \"../../constants.js\";\nimport CodecFrame from \"../CodecFrame.js\";\n\nexport default class FLACFrame extends CodecFrame {\n static _getFrameFooterCrc16(data) {\n return (data[data[length] - 2] << 8) + data[data[length] - 1];\n }\n\n // check frame footer crc\n // https://xiph.org/flac/format.html#frame_footer\n static [checkFrameFooterCrc16](data) {\n const expectedCrc16 = FLACFrame._getFrameFooterCrc16(data);\n const actualCrc16 = flacCrc16(data[subarray](0, -2));\n\n return expectedCrc16 === actualCrc16;\n }\n\n constructor(data, header, streamInfoValue) {\n header[streamInfo] = streamInfoValue;\n header[crc16] = FLACFrame._getFrameFooterCrc16(data);\n\n super(header, data, headerStore.get(header)[samples]);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\n/*\nhttps://xiph.org/flac/format.html\n\nAAAAAAAA AAAAAABC DDDDEEEE FFFFGGGH \n(IIIIIIII...)\n(JJJJJJJJ|JJJJJJJJ)\n(KKKKKKKK|KKKKKKKK)\nLLLLLLLLL\n\nFLAC Frame Header\nLetter Length (bits) Description\nA 13 11111111|11111\nB 1 Reserved 0 - mandatory, 1 - reserved\nC 1 Blocking strategy, 0 - fixed, 1 - variable\nD 4 Block size in inter-channel samples\nE 4 Sample rate\nF 4 Channel assignment\nG 3 Sample size in bits\nH 1 Reserved 0 - mandatory, 1 - reserved\nI ? if(variable blocksize)\n <8-56>:\"UTF-8\" coded sample number (decoded number is 36 bits) [4]\n else\n <8-48>:\"UTF-8\" coded frame number (decoded number is 31 bits) [4]\nJ ? if(blocksize bits == 011x)\n 8/16 bit (blocksize-1)\nK ? if(sample rate bits == 11xx)\n 8/16 bit sample rate\nL 8 CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) of everything before the crc, including the sync code\n \n*/\n\nimport {\n reserved,\n bad,\n rate88200,\n rate176400,\n rate192000,\n rate8000,\n rate16000,\n rate22050,\n rate24000,\n rate32000,\n rate44100,\n rate48000,\n rate96000,\n channelMappings,\n getChannelMapping,\n monophonic,\n stereo,\n lfe,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n length,\n crc16,\n blockingStrategy,\n blockSize,\n frameNumber,\n sampleNumber,\n streamInfo,\n description,\n samples,\n sampleRateBits,\n blockingStrategyBits,\n blockSizeBits,\n crc,\n subarray,\n readRawData,\n getHeader,\n setHeader,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\nimport { bytesToString, crc8 } from \"../../utilities.js\";\nimport CodecHeader from \"../CodecHeader.js\";\n\nconst getFromStreamInfo = \"get from STREAMINFO metadata block\";\n\nconst blockingStrategyValues = {\n 0b00000000: \"Fixed\",\n 0b00000001: \"Variable\",\n};\n\nconst blockSizeValues = {\n 0b00000000: reserved,\n 0b00010000: 192,\n // 0b00100000: 576,\n // 0b00110000: 1152,\n // 0b01000000: 2304,\n // 0b01010000: 4608,\n // 0b01100000: \"8-bit (blocksize-1) from end of header\",\n // 0b01110000: \"16-bit (blocksize-1) from end of header\",\n // 0b10000000: 256,\n // 0b10010000: 512,\n // 0b10100000: 1024,\n // 0b10110000: 2048,\n // 0b11000000: 4096,\n // 0b11010000: 8192,\n // 0b11100000: 16384,\n // 0b11110000: 32768,\n};\nfor (let i = 2; i < 16; i++)\n blockSizeValues[i << 4] = i < 6 ? 576 * 2 ** (i - 2) : 2 ** i;\n\nconst sampleRateValues = {\n 0b00000000: getFromStreamInfo,\n 0b00000001: rate88200,\n 0b00000010: rate176400,\n 0b00000011: rate192000,\n 0b00000100: rate8000,\n 0b00000101: rate16000,\n 0b00000110: rate22050,\n 0b00000111: rate24000,\n 0b00001000: rate32000,\n 0b00001001: rate44100,\n 0b00001010: rate48000,\n 0b00001011: rate96000,\n // 0b00001100: \"8-bit sample rate (in kHz) from end of header\",\n // 0b00001101: \"16-bit sample rate (in Hz) from end of header\",\n // 0b00001110: \"16-bit sample rate (in tens of Hz) from end of header\",\n 0b00001111: bad,\n};\n\n/* prettier-ignore */\nconst channelAssignments = {\n /*'\n 'monophonic (mono)'\n 'stereo (left, right)'\n 'linear surround (left, right, center)'\n 'quadraphonic (front left, front right, rear left, rear right)'\n '5.0 surround (front left, front right, front center, rear left, rear right)'\n '5.1 surround (front left, front right, front center, LFE, rear left, rear right)'\n '6.1 surround (front left, front right, front center, LFE, rear center, side left, side right)'\n '7.1 surround (front left, front right, front center, LFE, rear left, rear right, side left, side right)'\n */\n 0b00000000: {[channels]: 1, [description]: monophonic},\n 0b00010000: {[channels]: 2, [description]: getChannelMapping(2,channelMappings[0][0])},\n 0b00100000: {[channels]: 3, [description]: getChannelMapping(3,channelMappings[0][1])},\n 0b00110000: {[channels]: 4, [description]: getChannelMapping(4,channelMappings[1][0],channelMappings[3][0])},\n 0b01000000: {[channels]: 5, [description]: getChannelMapping(5,channelMappings[1][1],channelMappings[3][0])},\n 0b01010000: {[channels]: 6, [description]: getChannelMapping(6,channelMappings[1][1],lfe,channelMappings[3][0])},\n 0b01100000: {[channels]: 7, [description]: getChannelMapping(7,channelMappings[1][1],lfe,channelMappings[3][4],channelMappings[2][0])},\n 0b01110000: {[channels]: 8, [description]: getChannelMapping(8,channelMappings[1][1],lfe,channelMappings[3][0],channelMappings[2][0])},\n 0b10000000: {[channels]: 2, [description]: `${stereo} (left, diff)`},\n 0b10010000: {[channels]: 2, [description]: `${stereo} (diff, right)`},\n 0b10100000: {[channels]: 2, [description]: `${stereo} (avg, diff)`},\n 0b10110000: reserved,\n 0b11000000: reserved,\n 0b11010000: reserved,\n 0b11100000: reserved,\n 0b11110000: reserved,\n}\n\nconst bitDepthValues = {\n 0b00000000: getFromStreamInfo,\n 0b00000010: 8,\n 0b00000100: 12,\n 0b00000110: reserved,\n 0b00001000: 16,\n 0b00001010: 20,\n 0b00001100: 24,\n 0b00001110: reserved,\n};\n\nexport default class FLACHeader extends CodecHeader {\n // https://datatracker.ietf.org/doc/html/rfc3629#section-3\n // Char. number range | UTF-8 octet sequence\n // (hexadecimal) | (binary)\n // --------------------+---------------------------------------------\n // 0000 0000-0000 007F | 0xxxxxxx\n // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx\n // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx\n // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n static _decodeUTF8Int(data) {\n if (data[0] > 0xfe) {\n return null; // length byte must have at least one zero as the lsb\n }\n\n if (data[0] < 0x80) return { value: data[0], length: 1 };\n\n // get length by counting the number of msb that are set to 1\n let length = 1;\n for (let zeroMask = 0x40; zeroMask & data[0]; zeroMask >>= 1) length++;\n\n let idx = length - 1,\n value = 0,\n shift = 0;\n\n // sum together the encoded bits in bytes 2 to length\n // 1110xxxx 10[cccccc] 10[bbbbbb] 10[aaaaaa]\n //\n // value = [cccccc] | [bbbbbb] | [aaaaaa]\n for (; idx > 0; shift += 6, idx--) {\n if ((data[idx] & 0xc0) !== 0x80) {\n return null; // each byte should have leading 10xxxxxx\n }\n value |= (data[idx] & 0x3f) << shift; // add the encoded bits\n }\n\n // read the final encoded bits in byte 1\n // 1110[dddd] 10[cccccc] 10[bbbbbb] 10[aaaaaa]\n //\n // value = [dddd] | [cccccc] | [bbbbbb] | [aaaaaa]\n value |= (data[idx] & (0x7f >> length)) << shift;\n\n return { value, length };\n }\n\n static [getHeaderFromUint8Array](data, headerCache) {\n const codecParserStub = {\n [readRawData]: function* () {\n return data;\n },\n };\n\n return FLACHeader[getHeader](codecParserStub, headerCache, 0).next().value;\n }\n\n static *[getHeader](codecParser, headerCache, readOffset) {\n // Must be at least 6 bytes.\n let data = yield* codecParser[readRawData](6, readOffset);\n\n // Bytes (1-2 of 6)\n // * `11111111|111110..`: Frame sync\n // * `........|......0.`: Reserved 0 - mandatory, 1 - reserved\n if (data[0] !== 0xff || !(data[1] === 0xf8 || data[1] === 0xf9)) {\n return null;\n }\n\n const header = {};\n\n // Check header cache\n const key = bytesToString(data[subarray](0, 4));\n const cachedHeader = headerCache[getHeader](key);\n\n if (!cachedHeader) {\n // Byte (2 of 6)\n // * `.......C`: Blocking strategy, 0 - fixed, 1 - variable\n header[blockingStrategyBits] = data[1] & 0b00000001;\n header[blockingStrategy] =\n blockingStrategyValues[header[blockingStrategyBits]];\n\n // Byte (3 of 6)\n // * `DDDD....`: Block size in inter-channel samples\n // * `....EEEE`: Sample rate\n header[blockSizeBits] = data[2] & 0b11110000;\n header[sampleRateBits] = data[2] & 0b00001111;\n\n header[blockSize] = blockSizeValues[header[blockSizeBits]];\n if (header[blockSize] === reserved) {\n return null;\n }\n\n header[sampleRate] = sampleRateValues[header[sampleRateBits]];\n if (header[sampleRate] === bad) {\n return null;\n }\n\n // Byte (4 of 6)\n // * `FFFF....`: Channel assignment\n // * `....GGG.`: Sample size in bits\n // * `.......H`: Reserved 0 - mandatory, 1 - reserved\n if (data[3] & 0b00000001) {\n return null;\n }\n\n const channelAssignment = channelAssignments[data[3] & 0b11110000];\n if (channelAssignment === reserved) {\n return null;\n }\n\n header[channels] = channelAssignment[channels];\n header[channelMode] = channelAssignment[description];\n\n header[bitDepth] = bitDepthValues[data[3] & 0b00001110];\n if (header[bitDepth] === reserved) {\n return null;\n }\n } else {\n Object.assign(header, cachedHeader);\n }\n\n // Byte (5...)\n // * `IIIIIIII|...`: VBR block size ? sample number : frame number\n header[length] = 5;\n\n // check if there is enough data to parse UTF8\n data = yield* codecParser[readRawData](header[length] + 8, readOffset);\n\n const decodedUtf8 = FLACHeader._decodeUTF8Int(data[subarray](4));\n if (!decodedUtf8) {\n return null;\n }\n\n if (header[blockingStrategyBits]) {\n header[sampleNumber] = decodedUtf8.value;\n } else {\n header[frameNumber] = decodedUtf8.value;\n }\n\n header[length] += decodedUtf8[length];\n\n // Byte (...)\n // * `JJJJJJJJ|(JJJJJJJJ)`: Blocksize (8/16bit custom value)\n if (header[blockSizeBits] === 0b01100000) {\n // 8 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[blockSize] = data[header[length] - 1] + 1;\n header[length] += 1;\n } else if (header[blockSizeBits] === 0b01110000) {\n // 16 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[blockSize] =\n (data[header[length] - 1] << 8) + data[header[length]] + 1;\n header[length] += 2;\n }\n\n header[samples] = header[blockSize];\n\n // Byte (...)\n // * `KKKKKKKK|(KKKKKKKK)`: Sample rate (8/16bit custom value)\n if (header[sampleRateBits] === 0b00001100) {\n // 8 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[sampleRate] = data[header[length] - 1] * 1000;\n header[length] += 1;\n } else if (header[sampleRateBits] === 0b00001101) {\n // 16 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[sampleRate] =\n (data[header[length] - 1] << 8) + data[header[length]];\n header[length] += 2;\n } else if (header[sampleRateBits] === 0b00001110) {\n // 16 bit\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[sampleRate] =\n ((data[header[length] - 1] << 8) + data[header[length]]) * 10;\n header[length] += 2;\n }\n\n // Byte (...)\n // * `LLLLLLLL`: CRC-8\n if (data[length] < header[length])\n data = yield* codecParser[readRawData](header[length], readOffset);\n\n header[crc] = data[header[length] - 1];\n if (header[crc] !== crc8(data[subarray](0, header[length] - 1))) {\n return null;\n }\n\n {\n if (!cachedHeader) {\n const {\n blockingStrategyBits,\n frameNumber,\n sampleNumber,\n samples,\n sampleRateBits,\n blockSizeBits,\n crc,\n length,\n ...codecUpdateFields\n } = header;\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n }\n return new FLACHeader(header);\n }\n\n /**\n * @private\n * Call FLACHeader.getHeader(Array<Uint8>) to get instance\n */\n constructor(header) {\n super(header);\n\n this[crc16] = null; // set in FLACFrame\n this[blockingStrategy] = header[blockingStrategy];\n this[blockSize] = header[blockSize];\n this[frameNumber] = header[frameNumber];\n this[sampleNumber] = header[sampleNumber];\n this[streamInfo] = null; // set during ogg parsing\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { frameStore, headerStore } from \"../../globals.js\";\nimport {\n length,\n pageSequenceNumber,\n data,\n codec,\n codecFrames,\n segments,\n subarray,\n readRawData,\n incrementRawData,\n mapFrameStats,\n logWarning,\n parseFrame,\n parseOggPage,\n getHeader,\n enable,\n checkFrameFooterCrc16,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\nimport Parser from \"../Parser.js\";\nimport FLACFrame from \"./FLACFrame.js\";\nimport FLACHeader from \"./FLACHeader.js\";\n\nconst MIN_FLAC_FRAME_SIZE = 2;\nconst MAX_FLAC_FRAME_SIZE = 512 * 1024;\n\nexport default class FLACParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = FLACFrame;\n this.Header = FLACHeader;\n\n onCodec(this[codec]);\n }\n\n get [codec]() {\n return \"flac\";\n }\n\n *_getNextFrameSyncOffset(offset) {\n const data = yield* this._codecParser[readRawData](2, 0);\n const dataLength = data[length] - 2;\n\n while (offset < dataLength) {\n // * `11111111|111110..`: Frame sync\n // * `........|......0.`: Reserved 0 - mandatory, 1 - reserved\n const firstByte = data[offset];\n if (firstByte === 0xff) {\n const secondByte = data[offset + 1];\n if (secondByte === 0xf8 || secondByte === 0xf9) break;\n if (secondByte !== 0xff) offset++; // might as well check for the next sync byte\n }\n offset++;\n }\n\n return offset;\n }\n\n *[parseFrame]() {\n // find the first valid frame header\n do {\n const header = yield* FLACHeader[getHeader](\n this._codecParser,\n this._headerCache,\n 0,\n );\n\n if (header) {\n // found a valid frame header\n // find the next valid frame header\n let nextHeaderOffset =\n headerStore.get(header)[length] + MIN_FLAC_FRAME_SIZE;\n\n while (nextHeaderOffset <= MAX_FLAC_FRAME_SIZE) {\n if (\n this._codecParser._flushing ||\n (yield* FLACHeader[getHeader](\n this._codecParser,\n this._headerCache,\n nextHeaderOffset,\n ))\n ) {\n // found a valid next frame header\n let frameData =\n yield* this._codecParser[readRawData](nextHeaderOffset);\n\n if (!this._codecParser._flushing)\n frameData = frameData[subarray](0, nextHeaderOffset);\n\n // check that this is actually the next header by validating the frame footer crc16\n if (FLACFrame[checkFrameFooterCrc16](frameData)) {\n // both frame headers, and frame footer crc16 are valid, we are synced (odds are pretty low of a false positive)\n const frame = new FLACFrame(frameData, header);\n\n this._headerCache[enable](); // start caching when synced\n this._codecParser[incrementRawData](nextHeaderOffset); // increment to the next frame\n this._codecParser[mapFrameStats](frame);\n\n return frame;\n }\n }\n\n nextHeaderOffset = yield* this._getNextFrameSyncOffset(\n nextHeaderOffset + 1,\n );\n }\n\n this._codecParser[logWarning](\n `Unable to sync FLAC frame after searching ${nextHeaderOffset} bytes.`,\n );\n this._codecParser[incrementRawData](nextHeaderOffset);\n } else {\n // not synced, increment data to continue syncing\n this._codecParser[incrementRawData](\n yield* this._getNextFrameSyncOffset(1),\n );\n }\n } while (true);\n }\n\n [parseOggPage](oggPage) {\n if (oggPage[pageSequenceNumber] === 0) {\n // Identification header\n\n this._headerCache[enable]();\n this._streamInfo = oggPage[data][subarray](13);\n } else if (oggPage[pageSequenceNumber] === 1) {\n // Vorbis comments\n } else {\n oggPage[codecFrames] = frameStore\n .get(oggPage)\n [segments].map((segment) => {\n const header = FLACHeader[getHeaderFromUint8Array](\n segment,\n this._headerCache,\n );\n\n if (header) {\n return new FLACFrame(segment, header, this._streamInfo);\n } else {\n this._codecParser[logWarning](\n \"Failed to parse Ogg FLAC frame\",\n \"Skipping invalid FLAC frame\",\n );\n }\n })\n .filter((frame) => !!frame);\n }\n\n return oggPage;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\n/*\nhttps://xiph.org/ogg/doc/framing.html\n\nAAAAAAAA AAAAAAAA AAAAAAAA AAAAAAAA BBBBBBBB 00000CDE\n\n(LSB) (MSB)\nFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF\nGGGGGGGG GGGGGGGG GGGGGGGG GGGGGGGG\nHHHHHHHH HHHHHHHH HHHHHHHH HHHHHHHH\nIIIIIIII IIIIIIII IIIIIIII IIIIIIII\n\nJJJJJJJJ\nLLLLLLLL...\n\nOgg Page Header\nLetter Length (bits) Description\nA 32 0x4f676753, \"OggS\"\nB 8 stream_structure_version\nC 1 (0 no, 1 yes) last page of logical bitstream (eos)\nD 1 (0 no, 1 yes) first page of logical bitstream (bos)\nE 1 (0 no, 1 yes) continued packet\n\nF 64 absolute granule position\nG 32 stream serial number\nH 32 page sequence no\nI 32 page checksum\nJ 8 Number of page segments in the segment table\nL n Segment table (n=page_segments+26).\n Segment table values sum to the total length of the packet.\n Last value is always < 0xFF. Last lacing value will be 0x00 if evenly divisible by 0xFF.\n \n*/\n\nimport { headerStore } from \"../../globals.js\";\nimport {\n absoluteGranulePosition,\n isContinuedPacket,\n isFirstPage,\n isLastPage,\n pageSequenceNumber,\n streamSerialNumber,\n length,\n pageChecksum,\n frameLength,\n streamStructureVersion,\n pageSegmentTable,\n pageSegmentBytes,\n buffer,\n subarray,\n readRawData,\n getHeader,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\nimport { readInt64le } from \"../../utilities.js\";\n\nexport default class OggPageHeader {\n static *[getHeader](codecParser, headerCache, readOffset) {\n const header = {};\n\n // Must be at least 28 bytes.\n let data = yield* codecParser[readRawData](28, readOffset);\n\n // Bytes (1-4 of 28)\n // Frame sync (must equal OggS): `AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA`:\n if (\n data[0] !== 0x4f || // O\n data[1] !== 0x67 || // g\n data[2] !== 0x67 || // g\n data[3] !== 0x53 // S\n ) {\n return null;\n }\n\n // Byte (5 of 28)\n // * `BBBBBBBB`: stream_structure_version\n header[streamStructureVersion] = data[4];\n\n // Byte (6 of 28)\n // * `00000CDE`\n // * `00000...`: All zeros\n // * `.....C..`: (0 no, 1 yes) last page of logical bitstream (eos)\n // * `......D.`: (0 no, 1 yes) first page of logical bitstream (bos)\n // * `.......E`: (0 no, 1 yes) continued packet\n const zeros = data[5] & 0b11111000;\n if (zeros) return null;\n\n header[isLastPage] = !!(data[5] & 0b00000100);\n header[isFirstPage] = !!(data[5] & 0b00000010);\n header[isContinuedPacket] = !!(data[5] & 0b00000001);\n\n const view = new dataView(uint8Array.from(data[subarray](0, 28))[buffer]);\n\n // Byte (7-14 of 28)\n // * `FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF`\n // * Absolute Granule Position\n header[absoluteGranulePosition] = readInt64le(view, 6);\n\n // Byte (15-18 of 28)\n // * `GGGGGGGG|GGGGGGGG|GGGGGGGG|GGGGGGGG`\n // * Stream Serial Number\n header[streamSerialNumber] = view.getInt32(14, true);\n\n // Byte (19-22 of 28)\n // * `HHHHHHHH|HHHHHHHH|HHHHHHHH|HHHHHHHH`\n // * Page Sequence Number\n header[pageSequenceNumber] = view.getInt32(18, true);\n\n // Byte (23-26 of 28)\n // * `IIIIIIII|IIIIIIII|IIIIIIII|IIIIIIII`\n // * Page Checksum\n header[pageChecksum] = view.getInt32(22, true);\n\n // Byte (27 of 28)\n // * `JJJJJJJJ`: Number of page segments in the segment table\n const pageSegmentTableLength = data[26];\n header[length] = pageSegmentTableLength + 27;\n\n data = yield* codecParser[readRawData](header[length], readOffset); // read in the page segment table\n\n header[frameLength] = 0;\n header[pageSegmentTable] = [];\n header[pageSegmentBytes] = uint8Array.from(\n data[subarray](27, header[length]),\n );\n\n for (let i = 0, segmentLength = 0; i < pageSegmentTableLength; i++) {\n const segmentByte = header[pageSegmentBytes][i];\n\n header[frameLength] += segmentByte;\n segmentLength += segmentByte;\n\n if (segmentByte !== 0xff || i === pageSegmentTableLength - 1) {\n header[pageSegmentTable].push(segmentLength);\n segmentLength = 0;\n }\n }\n\n return new OggPageHeader(header);\n }\n\n /**\n * @private\n * Call OggPageHeader.getHeader(Array<Uint8>) to get instance\n */\n constructor(header) {\n headerStore.set(this, header);\n\n this[absoluteGranulePosition] = header[absoluteGranulePosition];\n this[isContinuedPacket] = header[isContinuedPacket];\n this[isFirstPage] = header[isFirstPage];\n this[isLastPage] = header[isLastPage];\n this[pageSegmentTable] = header[pageSegmentTable];\n this[pageSequenceNumber] = header[pageSequenceNumber];\n this[pageChecksum] = header[pageChecksum];\n this[streamSerialNumber] = header[streamSerialNumber];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { headerStore, frameStore } from \"../../globals.js\";\nimport {\n codecFrames,\n rawData,\n absoluteGranulePosition,\n crc32,\n duration,\n isContinuedPacket,\n isFirstPage,\n isLastPage,\n pageSequenceNumber,\n samples,\n streamSerialNumber,\n length,\n pageChecksum,\n frameLength,\n subarray,\n readRawData,\n getFrame,\n getHeader,\n} from \"../../constants.js\";\n\nimport Frame from \"../Frame.js\";\nimport OggPageHeader from \"./OggPageHeader.js\";\n\nexport default class OggPage extends Frame {\n static *[getFrame](codecParser, headerCache, readOffset) {\n const header = yield* OggPageHeader[getHeader](\n codecParser,\n headerCache,\n readOffset,\n );\n\n if (header) {\n const frameLengthValue = headerStore.get(header)[frameLength];\n const headerLength = headerStore.get(header)[length];\n const totalLength = headerLength + frameLengthValue;\n\n const rawDataValue = (yield* codecParser[readRawData](totalLength, 0))[\n subarray\n ](0, totalLength);\n\n const frame = rawDataValue[subarray](headerLength, totalLength);\n\n return new OggPage(header, frame, rawDataValue);\n } else {\n return null;\n }\n }\n\n constructor(header, frame, rawDataValue) {\n super(header, frame);\n\n frameStore.get(this)[length] = rawDataValue[length];\n\n this[codecFrames] = [];\n this[rawData] = rawDataValue;\n this[absoluteGranulePosition] = header[absoluteGranulePosition];\n this[crc32] = header[pageChecksum];\n this[duration] = 0;\n this[isContinuedPacket] = header[isContinuedPacket];\n this[isFirstPage] = header[isFirstPage];\n this[isLastPage] = header[isLastPage];\n this[pageSequenceNumber] = header[pageSequenceNumber];\n this[samples] = 0;\n this[streamSerialNumber] = header[streamSerialNumber];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport CodecFrame from \"../CodecFrame.js\";\n\nexport default class OpusFrame extends CodecFrame {\n constructor(data, header, samples) {\n super(header, data, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\n/*\nhttps://tools.ietf.org/html/rfc7845.html\n 0 1 2 3\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| 'O' | 'p' | 'u' | 's' |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| 'H' | 'e' | 'a' | 'd' |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| Version = 1 | Channel Count | Pre-skip |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| Input Sample Rate (Hz) |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n| Output Gain (Q7.8 in dB) | Mapping Family| |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ :\n| |\n: Optional Channel Mapping Table... :\n| |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nLetter Length (bits) Description\nA 64 Magic Signature - OpusHead\nB 8 Version number - 00000001\nC 8 Output channel count (unsigned)\nD 16 Pre-skip (unsigned, little endian)\nE 32 Sample rate (unsigned, little endian)\nF 16 Output Gain (signed, little endian)\nG 8 Channel Mapping family (unsigned)\n\n// if(channel mapping !== 0)\nH 8 Stream count (unsigned)\nI 8 Coupled Stream Count (unsigned)\nJ 8*C Channel Mapping\n*/\n\nimport {\n rate48000,\n vorbisOpusChannelMapping,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n length,\n bandwidth,\n channelMappingFamily,\n channelMappingTable,\n coupledStreamCount,\n frameCount,\n frameSize,\n hasOpusPadding,\n inputSampleRate,\n isVbr,\n mode,\n outputGain,\n preSkip,\n streamCount,\n data,\n buffer,\n subarray,\n getHeader,\n setHeader,\n getHeaderFromUint8Array,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\nimport { bytesToString } from \"../../utilities.js\";\n\nimport CodecHeader from \"../CodecHeader.js\";\n\n/* prettier-ignore */\nconst channelMappingFamilies = {\n 0b00000000: vorbisOpusChannelMapping.slice(0,2),\n /*\n 0: \"monophonic (mono)\"\n 1: \"stereo (left, right)\"\n */\n 0b00000001: vorbisOpusChannelMapping\n /*\n 0: \"monophonic (mono)\"\n 1: \"stereo (left, right)\"\n 2: \"linear surround (left, center, right)\"\n 3: \"quadraphonic (front left, front right, rear left, rear right)\"\n 4: \"5.0 surround (front left, front center, front right, rear left, rear right)\"\n 5: \"5.1 surround (front left, front center, front right, rear left, rear right, LFE)\"\n 6: \"6.1 surround (front left, front center, front right, side left, side right, rear center, LFE)\"\n 7: \"7.1 surround (front left, front center, front right, side left, side right, rear left, rear right, LFE)\"\n */\n // additional channel mappings are user defined\n};\n\nconst silkOnly = \"SILK-only\";\nconst celtOnly = \"CELT-only\";\nconst hybrid = \"Hybrid\";\n\nconst narrowBand = \"narrowband\";\nconst mediumBand = \"medium-band\";\nconst wideBand = \"wideband\";\nconst superWideBand = \"super-wideband\";\nconst fullBand = \"fullband\";\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// | config |s| c |\n// +-+-+-+-+-+-+-+-+\n// prettier-ignore\nconst configTable = {\n 0b00000000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 10 },\n 0b00001000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 20 },\n 0b00010000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 40 },\n 0b00011000: { [mode]: silkOnly, [bandwidth]: narrowBand, [frameSize]: 60 },\n 0b00100000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 10 },\n 0b00101000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 20 },\n 0b00110000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 40 },\n 0b00111000: { [mode]: silkOnly, [bandwidth]: mediumBand, [frameSize]: 60 },\n 0b01000000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 10 },\n 0b01001000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 20 },\n 0b01010000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 40 },\n 0b01011000: { [mode]: silkOnly, [bandwidth]: wideBand, [frameSize]: 60 },\n 0b01100000: { [mode]: hybrid, [bandwidth]: superWideBand, [frameSize]: 10 },\n 0b01101000: { [mode]: hybrid, [bandwidth]: superWideBand, [frameSize]: 20 },\n 0b01110000: { [mode]: hybrid, [bandwidth]: fullBand, [frameSize]: 10 },\n 0b01111000: { [mode]: hybrid, [bandwidth]: fullBand, [frameSize]: 20 },\n 0b10000000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 2.5 },\n 0b10001000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 5 },\n 0b10010000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 10 },\n 0b10011000: { [mode]: celtOnly, [bandwidth]: narrowBand, [frameSize]: 20 },\n 0b10100000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 2.5 },\n 0b10101000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 5 },\n 0b10110000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 10 },\n 0b10111000: { [mode]: celtOnly, [bandwidth]: wideBand, [frameSize]: 20 },\n 0b11000000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 2.5 },\n 0b11001000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 5 },\n 0b11010000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 10 },\n 0b11011000: { [mode]: celtOnly, [bandwidth]: superWideBand, [frameSize]: 20 },\n 0b11100000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 2.5 },\n 0b11101000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 5 },\n 0b11110000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 10 },\n 0b11111000: { [mode]: celtOnly, [bandwidth]: fullBand, [frameSize]: 20 },\n};\n\nexport default class OpusHeader extends CodecHeader {\n static [getHeaderFromUint8Array](dataValue, packetData, headerCache) {\n const header = {};\n\n // get length of header\n // Byte (10 of 19)\n // * `CCCCCCCC`: Channel Count\n header[channels] = dataValue[9];\n // Byte (19 of 19)\n // * `GGGGGGGG`: Channel Mapping Family\n header[channelMappingFamily] = dataValue[18];\n\n header[length] =\n header[channelMappingFamily] !== 0 ? 21 + header[channels] : 19;\n\n if (dataValue[length] < header[length])\n throw new Error(\"Out of data while inside an Ogg Page\");\n\n // Page Segment Bytes (1-2)\n // * `AAAAA...`: Packet config\n // * `.....B..`:\n // * `......CC`: Packet code\n const packetMode = packetData[0] & 0b00000011;\n const packetLength = packetMode === 3 ? 2 : 1;\n\n // Check header cache\n const key =\n bytesToString(dataValue[subarray](0, header[length])) +\n bytesToString(packetData[subarray](0, packetLength));\n const cachedHeader = headerCache[getHeader](key);\n\n if (cachedHeader) return new OpusHeader(cachedHeader);\n\n // Bytes (1-8 of 19): OpusHead - Magic Signature\n if (key.substr(0, 8) !== \"OpusHead\") {\n return null;\n }\n\n // Byte (9 of 19)\n // * `00000001`: Version number\n if (dataValue[8] !== 1) return null;\n\n header[data] = uint8Array.from(dataValue[subarray](0, header[length]));\n\n const view = new dataView(header[data][buffer]);\n\n header[bitDepth] = 16;\n\n // Byte (10 of 19)\n // * `CCCCCCCC`: Channel Count\n // set earlier to determine length\n\n // Byte (11-12 of 19)\n // * `DDDDDDDD|DDDDDDDD`: Pre skip\n header[preSkip] = view.getUint16(10, true);\n\n // Byte (13-16 of 19)\n // * `EEEEEEEE|EEEEEEEE|EEEEEEEE|EEEEEEEE`: Sample Rate\n header[inputSampleRate] = view.getUint32(12, true);\n // Opus is always decoded at 48kHz\n header[sampleRate] = rate48000;\n\n // Byte (17-18 of 19)\n // * `FFFFFFFF|FFFFFFFF`: Output Gain\n header[outputGain] = view.getInt16(16, true);\n\n // Byte (19 of 19)\n // * `GGGGGGGG`: Channel Mapping Family\n // set earlier to determine length\n if (header[channelMappingFamily] in channelMappingFamilies) {\n header[channelMode] =\n channelMappingFamilies[header[channelMappingFamily]][\n header[channels] - 1\n ];\n if (!header[channelMode]) return null;\n }\n\n if (header[channelMappingFamily] !== 0) {\n // * `HHHHHHHH`: Stream count\n header[streamCount] = dataValue[19];\n\n // * `IIIIIIII`: Coupled Stream count\n header[coupledStreamCount] = dataValue[20];\n\n // * `JJJJJJJJ|...` Channel Mapping table\n header[channelMappingTable] = [\n ...dataValue[subarray](21, header[channels] + 21),\n ];\n }\n\n const packetConfig = configTable[0b11111000 & packetData[0]];\n header[mode] = packetConfig[mode];\n header[bandwidth] = packetConfig[bandwidth];\n header[frameSize] = packetConfig[frameSize];\n\n // https://tools.ietf.org/html/rfc6716#appendix-B\n switch (packetMode) {\n case 0:\n // 0: 1 frame in the packet\n header[frameCount] = 1;\n break;\n case 1:\n // 1: 2 frames in the packet, each with equal compressed size\n case 2:\n // 2: 2 frames in the packet, with different compressed sizes\n header[frameCount] = 2;\n break;\n case 3:\n // 3: an arbitrary number of frames in the packet\n header[isVbr] = !!(0b10000000 & packetData[1]);\n header[hasOpusPadding] = !!(0b01000000 & packetData[1]);\n header[frameCount] = 0b00111111 & packetData[1];\n break;\n default:\n return null;\n }\n\n // set header cache\n {\n const {\n length,\n data: headerData,\n channelMappingFamily,\n ...codecUpdateFields\n } = header;\n\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n\n return new OpusHeader(header);\n }\n\n /**\n * @private\n * Call OpusHeader.getHeader(Array<Uint8>) to get instance\n */\n constructor(header) {\n super(header);\n\n this[data] = header[data];\n this[bandwidth] = header[bandwidth];\n this[channelMappingFamily] = header[channelMappingFamily];\n this[channelMappingTable] = header[channelMappingTable];\n this[coupledStreamCount] = header[coupledStreamCount];\n this[frameCount] = header[frameCount];\n this[frameSize] = header[frameSize];\n this[hasOpusPadding] = header[hasOpusPadding];\n this[inputSampleRate] = header[inputSampleRate];\n this[isVbr] = header[isVbr];\n this[mode] = header[mode];\n this[outputGain] = header[outputGain];\n this[preSkip] = header[preSkip];\n this[streamCount] = header[streamCount];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { frameStore } from \"../../globals.js\";\nimport {\n codecFrames,\n data,\n pageSequenceNumber,\n codec,\n segments,\n logError,\n parseOggPage,\n enable,\n getHeaderFromUint8Array,\n preSkip,\n frameSize,\n frameCount,\n sampleRate,\n} from \"../../constants.js\";\nimport Parser from \"../Parser.js\";\nimport OpusFrame from \"./OpusFrame.js\";\nimport OpusHeader from \"./OpusHeader.js\";\n\nexport default class OpusParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = OpusFrame;\n this.Header = OpusHeader;\n\n onCodec(this[codec]);\n this._identificationHeader = null;\n this._preSkipRemaining = null;\n }\n\n get [codec]() {\n return \"opus\";\n }\n\n /**\n * @todo implement continued page support\n */\n [parseOggPage](oggPage) {\n if (oggPage[pageSequenceNumber] === 0) {\n // Identification header\n\n this._headerCache[enable]();\n this._identificationHeader = oggPage[data];\n } else if (oggPage[pageSequenceNumber] === 1) {\n // OpusTags\n } else {\n oggPage[codecFrames] = frameStore\n .get(oggPage)\n [segments].map((segment) => {\n const header = OpusHeader[getHeaderFromUint8Array](\n this._identificationHeader,\n segment,\n this._headerCache,\n );\n\n if (header) {\n if (this._preSkipRemaining === null)\n this._preSkipRemaining = header[preSkip];\n\n let samples =\n ((header[frameSize] * header[frameCount]) / 1000) *\n header[sampleRate];\n\n if (this._preSkipRemaining > 0) {\n this._preSkipRemaining -= samples;\n samples =\n this._preSkipRemaining < 0 ? -this._preSkipRemaining : 0;\n }\n\n return new OpusFrame(segment, header, samples);\n }\n\n this._codecParser[logError](\n \"Failed to parse Ogg Opus Header\",\n \"Not a valid Ogg Opus file\",\n );\n });\n }\n\n return oggPage;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport CodecFrame from \"../CodecFrame.js\";\n\nexport default class VorbisFrame extends CodecFrame {\n constructor(data, header, samples) {\n super(header, data, samples);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\n/*\n\n1 1) [packet_type] : 8 bit value\n2 2) 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73: the characters ’v’,’o’,’r’,’b’,’i’,’s’ as six octets\n\nLetter bits Description\nA 8 Packet type\nB 48 Magic signature (vorbis)\nC 32 Version number\nD 8 Channels\nE 32 Sample rate\nF 32 Bitrate Maximum (signed)\nG 32 Bitrate Nominal (signed)\nH 32 Bitrate Minimum (signed)\nI 4 blocksize 1\nJ 4 blocksize 0\nK 1 Framing flag\n*/\n\nimport {\n vorbisOpusChannelMapping,\n bitDepth,\n channelMode,\n sampleRate,\n channels,\n length,\n bitrateMaximum,\n bitrateMinimum,\n bitrateNominal,\n blocksize0,\n blocksize1,\n data,\n vorbisComments,\n vorbisSetup,\n version,\n buffer,\n subarray,\n getHeader,\n setHeader,\n getHeaderFromUint8Array,\n uint8Array,\n dataView,\n} from \"../../constants.js\";\nimport { bytesToString } from \"../../utilities.js\";\n\nimport CodecHeader from \"../CodecHeader.js\";\n\nconst blockSizes = {\n // 0b0110: 64,\n // 0b0111: 128,\n // 0b1000: 256,\n // 0b1001: 512,\n // 0b1010: 1024,\n // 0b1011: 2048,\n // 0b1100: 4096,\n // 0b1101: 8192\n};\nfor (let i = 0; i < 8; i++) blockSizes[i + 6] = 2 ** (6 + i);\n\nexport default class VorbisHeader extends CodecHeader {\n static [getHeaderFromUint8Array](\n dataValue,\n headerCache,\n vorbisCommentsData,\n vorbisSetupData,\n ) {\n // Must be at least 30 bytes.\n if (dataValue[length] < 30)\n throw new Error(\"Out of data while inside an Ogg Page\");\n\n // Check header cache\n const key = bytesToString(dataValue[subarray](0, 30));\n const cachedHeader = headerCache[getHeader](key);\n if (cachedHeader) return new VorbisHeader(cachedHeader);\n\n const header = { [length]: 30 };\n\n // Bytes (1-7 of 30): /01vorbis - Magic Signature\n if (key.substr(0, 7) !== \"\\x01vorbis\") {\n return null;\n }\n\n header[data] = uint8Array.from(dataValue[subarray](0, 30));\n const view = new dataView(header[data][buffer]);\n\n // Byte (8-11 of 30)\n // * `CCCCCCCC|CCCCCCCC|CCCCCCCC|CCCCCCCC`: Version number\n header[version] = view.getUint32(7, true);\n if (header[version] !== 0) return null;\n\n // Byte (12 of 30)\n // * `DDDDDDDD`: Channel Count\n header[channels] = dataValue[11];\n header[channelMode] =\n vorbisOpusChannelMapping[header[channels] - 1] || \"application defined\";\n\n // Byte (13-16 of 30)\n // * `EEEEEEEE|EEEEEEEE|EEEEEEEE|EEEEEEEE`: Sample Rate\n header[sampleRate] = view.getUint32(12, true);\n\n // Byte (17-20 of 30)\n // * `FFFFFFFF|FFFFFFFF|FFFFFFFF|FFFFFFFF`: Bitrate Maximum\n header[bitrateMaximum] = view.getInt32(16, true);\n\n // Byte (21-24 of 30)\n // * `GGGGGGGG|GGGGGGGG|GGGGGGGG|GGGGGGGG`: Bitrate Nominal\n header[bitrateNominal] = view.getInt32(20, true);\n\n // Byte (25-28 of 30)\n // * `HHHHHHHH|HHHHHHHH|HHHHHHHH|HHHHHHHH`: Bitrate Minimum\n header[bitrateMinimum] = view.getInt32(24, true);\n\n // Byte (29 of 30)\n // * `IIII....` Blocksize 1\n // * `....JJJJ` Blocksize 0\n header[blocksize1] = blockSizes[(dataValue[28] & 0b11110000) >> 4];\n header[blocksize0] = blockSizes[dataValue[28] & 0b00001111];\n if (header[blocksize0] > header[blocksize1]) return null;\n\n // Byte (29 of 30)\n // * `00000001` Framing bit\n if (dataValue[29] !== 0x01) return null;\n\n header[bitDepth] = 32;\n header[vorbisSetup] = vorbisSetupData;\n header[vorbisComments] = vorbisCommentsData;\n\n {\n // set header cache\n const {\n length,\n data,\n version,\n vorbisSetup,\n vorbisComments,\n ...codecUpdateFields\n } = header;\n headerCache[setHeader](key, header, codecUpdateFields);\n }\n\n return new VorbisHeader(header);\n }\n\n /**\n * @private\n * Call VorbisHeader.getHeader(Array<Uint8>) to get instance\n */\n constructor(header) {\n super(header);\n\n this[bitrateMaximum] = header[bitrateMaximum];\n this[bitrateMinimum] = header[bitrateMinimum];\n this[bitrateNominal] = header[bitrateNominal];\n this[blocksize0] = header[blocksize0];\n this[blocksize1] = header[blocksize1];\n this[data] = header[data];\n this[vorbisComments] = header[vorbisComments];\n this[vorbisSetup] = header[vorbisSetup];\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { frameStore } from \"../../globals.js\";\nimport { BitReader, reverse } from \"../../utilities.js\";\nimport {\n data,\n codec,\n blocksize0,\n blocksize1,\n codecFrames,\n segments,\n vorbis,\n logWarning,\n parseOggPage,\n enable,\n getHeaderFromUint8Array,\n} from \"../../constants.js\";\n\nimport Parser from \"../Parser.js\";\nimport VorbisFrame from \"./VorbisFrame.js\";\nimport VorbisHeader from \"./VorbisHeader.js\";\n\nexport default class VorbisParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n this.Frame = VorbisFrame;\n\n onCodec(this[codec]);\n\n this._identificationHeader = null;\n this._setupComplete = false;\n\n this._prevBlockSize = null;\n }\n\n get [codec]() {\n return vorbis;\n }\n\n [parseOggPage](oggPage) {\n oggPage[codecFrames] = [];\n\n for (const oggPageSegment of frameStore.get(oggPage)[segments]) {\n if (oggPageSegment[0] === 1) {\n // Identification header\n\n this._headerCache[enable]();\n this._identificationHeader = oggPage[data];\n this._setupComplete = false;\n } else if (oggPageSegment[0] === 3) {\n // comment header\n\n this._vorbisComments = oggPageSegment;\n } else if (oggPageSegment[0] === 5) {\n // setup header\n\n this._vorbisSetup = oggPageSegment;\n this._mode = this._parseSetupHeader(oggPageSegment);\n this._setupComplete = true;\n } else if (this._setupComplete) {\n const header = VorbisHeader[getHeaderFromUint8Array](\n this._identificationHeader,\n this._headerCache,\n this._vorbisComments,\n this._vorbisSetup,\n );\n\n if (header) {\n oggPage[codecFrames].push(\n new VorbisFrame(\n oggPageSegment,\n header,\n this._getSamples(oggPageSegment, header),\n ),\n );\n } else {\n this._codecParser[logError](\n \"Failed to parse Ogg Vorbis Header\",\n \"Not a valid Ogg Vorbis file\",\n );\n }\n }\n }\n\n return oggPage;\n }\n\n _getSamples(segment, header) {\n const blockFlag =\n this._mode.blockFlags[(segment[0] >> 1) & this._mode.mask];\n\n const currentBlockSize = blockFlag\n ? header[blocksize1]\n : header[blocksize0];\n\n // data is not returned on the first frame, but is used to prime the decoder\n // https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-590004\n const samplesValue =\n this._prevBlockSize === null\n ? 0\n : (this._prevBlockSize + currentBlockSize) / 4;\n\n this._prevBlockSize = currentBlockSize;\n\n return samplesValue;\n }\n\n // https://gitlab.xiph.org/xiph/liboggz/-/blob/master/src/liboggz/oggz_auto.c#L911\n // https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/vorbis_parser.c\n /*\n * This is the format of the mode data at the end of the packet for all\n * Vorbis Version 1 :\n *\n * [ 6:number_of_modes ]\n * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]\n * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]\n * [ 1:size | 16:window_type(0) | 16:transform_type(0) | 8:mapping ]\n * [ 1:framing(1) ]\n *\n * e.g.:\n *\n * MsB LsB\n * <-\n * 0 0 0 0 0 1 0 0\n * 0 0 1 0 0 0 0 0\n * 0 0 1 0 0 0 0 0\n * 0 0 1|0 0 0 0 0\n * 0 0 0 0|0|0 0 0\n * 0 0 0 0 0 0 0 0\n * 0 0 0 0|0 0 0 0\n * 0 0 0 0 0 0 0 0\n * 0 0 0 0|0 0 0 0\n * 0 0 0|1|0 0 0 0 |\n * 0 0 0 0 0 0 0 0 V\n * 0 0 0|0 0 0 0 0\n * 0 0 0 0 0 0 0 0\n * 0 0|1 0 0 0 0 0\n *\n * The simplest way to approach this is to start at the end\n * and read backwards to determine the mode configuration.\n *\n * liboggz and ffmpeg both use this method.\n */\n _parseSetupHeader(setup) {\n const bitReader = new BitReader(setup);\n const mode = {\n count: 0,\n blockFlags: [],\n };\n\n // sync with the framing bit\n while ((bitReader.read(1) & 0x01) !== 1) {}\n\n let modeBits;\n // search in reverse to parse out the mode entries\n // limit mode count to 63 so previous block flag will be in first packet byte\n while (mode.count < 64 && bitReader.position > 0) {\n reverse(bitReader.read(8)); // read mapping\n\n // 16 bits transform type, 16 bits window type, all values must be zero\n let currentByte = 0;\n while (bitReader.read(8) === 0x00 && currentByte++ < 3) {} // a non-zero value may indicate the end of the mode entries, or invalid data\n\n if (currentByte === 4) {\n // transform type and window type were all zeros\n modeBits = bitReader.read(7); // modeBits may need to be used in the next iteration if this is the last mode entry\n mode.blockFlags.unshift(modeBits & 0x01); // read and store mode number -> block flag\n bitReader.position += 6; // go back 6 bits so next iteration starts right after the block flag\n mode.count++;\n } else {\n // transform type and window type were not all zeros\n // check for mode count using previous iteration modeBits\n if (((reverse(modeBits) & 0b01111110) >> 1) + 1 !== mode.count) {\n this._codecParser[logWarning](\n \"vorbis derived mode count did not match actual mode count\",\n );\n }\n\n break;\n }\n }\n\n // xxxxxxxa packet type\n // xxxxxxbx mode count (number of mode count bits)\n // xxxxxcxx previous window flag\n // xxxxdxxx next window flag\n mode.mask = (1 << Math.log2(mode.count)) - 1;\n\n return mode;\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { headerStore, frameStore } from \"../../globals.js\";\nimport { bytesToString, concatBuffers } from \"../../utilities.js\";\nimport {\n header,\n pageSequenceNumber,\n pageSegmentBytes,\n pageSegmentTable,\n codec,\n data,\n length,\n samples,\n segments,\n subarray,\n vorbis,\n mapFrameStats,\n logWarning,\n fixedLengthFrameSync,\n parseFrame,\n parseOggPage,\n reset,\n uint8Array,\n isLastPage,\n streamSerialNumber,\n absoluteGranulePosition,\n} from \"../../constants.js\";\n\nimport Parser from \"../../codecs/Parser.js\";\nimport OggPage from \"./OggPage.js\";\nimport OggPageHeader from \"./OggPageHeader.js\";\n\nimport FLACParser from \"../../codecs/flac/FLACParser.js\";\nimport OpusParser from \"../../codecs/opus/OpusParser.js\";\nimport VorbisParser from \"../../codecs/vorbis/VorbisParser.js\";\n\nclass OggStream {\n constructor(codecParser, headerCache, onCodec) {\n this._codecParser = codecParser;\n this._headerCache = headerCache;\n this._onCodec = onCodec;\n\n this._continuedPacket = new uint8Array();\n this._codec = null;\n this._isSupported = null;\n this._previousAbsoluteGranulePosition = null;\n }\n\n get [codec]() {\n return this._codec || \"\";\n }\n\n _updateCodec(codec, Parser) {\n if (this._codec !== codec) {\n this._headerCache[reset]();\n this._parser = new Parser(\n this._codecParser,\n this._headerCache,\n this._onCodec,\n );\n this._codec = codec;\n }\n }\n\n _checkCodecSupport({ data }) {\n const idString = bytesToString(data[subarray](0, 8));\n\n switch (idString) {\n case \"fishead\\0\":\n return false; // ignore ogg skeleton packets\n case \"OpusHead\":\n this._updateCodec(\"opus\", OpusParser);\n return true;\n case /^\\x7fFLAC/.test(idString) && idString:\n this._updateCodec(\"flac\", FLACParser);\n return true;\n case /^\\x01vorbis/.test(idString) && idString:\n this._updateCodec(vorbis, VorbisParser);\n return true;\n default:\n return false;\n }\n }\n\n _checkPageSequenceNumber(oggPage) {\n if (\n oggPage[pageSequenceNumber] !== this._pageSequenceNumber + 1 &&\n this._pageSequenceNumber > 1 &&\n oggPage[pageSequenceNumber] > 1\n ) {\n this._codecParser[logWarning](\n \"Unexpected gap in Ogg Page Sequence Number.\",\n `Expected: ${this._pageSequenceNumber + 1}, Got: ${\n oggPage[pageSequenceNumber]\n }`,\n );\n }\n\n this._pageSequenceNumber = oggPage[pageSequenceNumber];\n }\n\n _parsePage(oggPage) {\n if (this._isSupported === null) {\n this._pageSequenceNumber = oggPage[pageSequenceNumber];\n this._isSupported = this._checkCodecSupport(oggPage);\n }\n\n this._checkPageSequenceNumber(oggPage);\n\n const oggPageStore = frameStore.get(oggPage);\n const headerData = headerStore.get(oggPageStore[header]);\n\n let offset = 0;\n oggPageStore[segments] = headerData[pageSegmentTable].map((segmentLength) =>\n oggPage[data][subarray](offset, (offset += segmentLength)),\n );\n\n // prepend any existing continued packet data\n if (this._continuedPacket[length]) {\n oggPageStore[segments][0] = concatBuffers(\n this._continuedPacket,\n oggPageStore[segments][0],\n );\n\n this._continuedPacket = new uint8Array();\n }\n\n // save any new continued packet data\n if (\n headerData[pageSegmentBytes][headerData[pageSegmentBytes][length] - 1] ===\n 0xff\n ) {\n this._continuedPacket = concatBuffers(\n this._continuedPacket,\n oggPageStore[segments].pop(),\n );\n }\n\n // set total samples in this ogg page\n if (this._previousAbsoluteGranulePosition !== null) {\n oggPage[samples] = Number(\n oggPage[absoluteGranulePosition] -\n this._previousAbsoluteGranulePosition,\n );\n }\n\n this._previousAbsoluteGranulePosition = oggPage[absoluteGranulePosition];\n\n if (this._isSupported) {\n const frame = this._parser[parseOggPage](oggPage);\n this._codecParser[mapFrameStats](frame);\n\n return frame;\n } else {\n return oggPage;\n }\n }\n}\n\nexport default class OggParser extends Parser {\n constructor(codecParser, headerCache, onCodec) {\n super(codecParser, headerCache);\n\n this._onCodec = onCodec;\n this.Frame = OggPage;\n this.Header = OggPageHeader;\n\n this._streams = new Map();\n this._currentSerialNumber = null;\n }\n\n get [codec]() {\n const oggStream = this._streams.get(this._currentSerialNumber);\n\n return oggStream ? oggStream.codec : \"\";\n }\n\n *[parseFrame]() {\n const oggPage = yield* this[fixedLengthFrameSync](true);\n this._currentSerialNumber = oggPage[streamSerialNumber];\n\n let oggStream = this._streams.get(this._currentSerialNumber);\n if (!oggStream) {\n oggStream = new OggStream(\n this._codecParser,\n this._headerCache,\n this._onCodec,\n );\n this._streams.set(this._currentSerialNumber, oggStream);\n }\n\n if (oggPage[isLastPage]) this._streams.delete(this._currentSerialNumber);\n\n return oggStream._parsePage(oggPage);\n }\n}\n","/* Copyright 2020-2023 Ethan Halsall\n \n This file is part of codec-parser.\n \n codec-parser is free software: you can redistribute it and/or modify\n it under the terms of the GNU Lesser General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n codec-parser is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU Lesser General Public License for more details.\n\n You should have received a copy of the GNU Lesser General Public License\n along with this program. If not, see <https://www.gnu.org/licenses/>\n*/\n\nimport { crc32Function, concatBuffers } from \"./utilities.js\";\nimport {\n header,\n sampleRate,\n bitrate,\n length,\n frameNumber,\n data,\n samples,\n codec,\n codecFrames,\n totalBytesOut,\n totalSamples,\n totalDuration,\n crc32,\n duration,\n subarray,\n readRawData,\n incrementRawData,\n mapCodecFrameStats,\n mapFrameStats,\n logWarning,\n logError,\n parseFrame,\n checkCodecUpdate,\n reset,\n isLastPage,\n} from \"./constants.js\";\nimport HeaderCache from \"./codecs/HeaderCache.js\";\nimport MPEGParser from \"./codecs/mpeg/MPEGParser.js\";\nimport AACParser from \"./codecs/aac/AACParser.js\";\nimport FLACParser from \"./codecs/flac/FLACParser.js\";\nimport OggParser from \"./containers/ogg/OggParser.js\";\n\nconst noOp = () => {};\n\nexport default class CodecParser {\n constructor(\n mimeType,\n {\n onCodec,\n onCodecHeader,\n onCodecUpdate,\n enableLogging = false,\n enableFrameCRC32 = true,\n } = {},\n ) {\n this._inputMimeType = mimeType;\n this._onCodec = onCodec || noOp;\n this._onCodecHeader = onCodecHeader || noOp;\n this._onCodecUpdate = onCodecUpdate;\n this._enableLogging = enableLogging;\n this._crc32 = enableFrameCRC32 ? crc32Function : noOp;\n\n this[reset]();\n }\n\n /**\n * @public\n * @returns The detected codec\n */\n get [codec]() {\n return this._parser ? this._parser[codec] : \"\";\n }\n\n [reset]() {\n this._headerCache = new HeaderCache(\n this._onCodecHeader,\n this._onCodecUpdate,\n );\n\n this._generator = this._getGenerator();\n this._generator.next();\n }\n\n /**\n * @public\n * @description Generator function that yields any buffered CodecFrames and resets the CodecParser\n * @returns {Iterable<CodecFrame|OggPage>} Iterator that operates over the codec data.\n * @yields {CodecFrame|OggPage} Parsed codec or ogg page data\n */\n *flush() {\n this._flushing = true;\n\n for (let i = this._generator.next(); i.value; i = this._generator.next()) {\n yield i.value;\n }\n\n this._flushing = false;\n\n this[reset]();\n }\n\n /**\n * @public\n * @description Generator function takes in a Uint8Array of data and returns a CodecFrame from the data for each iteration\n * @param {Uint8Array} chunk Next chunk of codec data to read\n * @returns {Iterable<CodecFrame|OggPage>} Iterator that operates over the codec data.\n * @yields {CodecFrame|OggPage} Parsed codec or ogg page data\n */\n *parseChunk(chunk) {\n for (\n let i = this._generator.next(chunk);\n i.value;\n i = this._generator.next()\n ) {\n yield i.value;\n }\n }\n\n /**\n * @public\n * @description Parses an entire file and returns all of the contained frames.\n * @param {Uint8Array} fileData Coded data to read\n * @returns {Array<CodecFrame|OggPage>} CodecFrames\n */\n parseAll(fileData) {\n return [...this.parseChunk(fileData), ...this.flush()];\n }\n\n /**\n * @private\n */\n *_getGenerator() {\n if (this._inputMimeType.match(/aac/)) {\n this._parser = new AACParser(this, this._headerCache, this._onCodec);\n } else if (this._inputMimeType.match(/mpeg/)) {\n this._parser = new MPEGParser(this, this._headerCache, this._onCodec);\n } else if (this._inputMimeType.match(/flac/)) {\n this._parser = new FLACParser(this, this._headerCache, this._onCodec);\n } else if (this._inputMimeType.match(/ogg/)) {\n this._parser = new OggParser(this, this._headerCache, this._onCodec);\n } else {\n throw new Error(`Unsupported Codec ${mimeType}`);\n }\n\n this._frameNumber = 0;\n this._currentReadPosition = 0;\n this._totalBytesIn = 0;\n this._totalBytesOut = 0;\n this._totalSamples = 0;\n this._sampleRate = undefined;\n\n this._rawData = new Uint8Array(0);\n\n // start parsing out frames\n while (true) {\n const frame = yield* this._parser[parseFrame]();\n if (frame) yield frame;\n }\n }\n\n /**\n * @protected\n * @param {number} minSize Minimum bytes to have present in buffer\n * @returns {Uint8Array} rawData\n */\n *[readRawData](minSize = 0, readOffset = 0) {\n let rawData;\n\n while (this._rawData[length] <= minSize + readOffset) {\n rawData = yield;\n\n if (this._flushing) return this._rawData[subarray](readOffset);\n\n if (rawData) {\n this._totalBytesIn += rawData[length];\n this._rawData = concatBuffers(this._rawData, rawData);\n }\n }\n\n return this._rawData[subarray](readOffset);\n }\n\n /**\n * @protected\n * @param {number} increment Bytes to increment codec data\n */\n [incrementRawData](increment) {\n this._currentReadPosition += increment;\n this._rawData = this._rawData[subarray](increment);\n }\n\n /**\n * @protected\n */\n [mapCodecFrameStats](frame) {\n this._sampleRate = frame[header][sampleRate];\n\n frame[header][bitrate] =\n frame[duration] > 0\n ? Math.round(frame[data][length] / frame[duration]) * 8\n : 0;\n frame[frameNumber] = this._frameNumber++;\n frame[totalBytesOut] = this._totalBytesOut;\n frame[totalSamples] = this._totalSamples;\n frame[totalDuration] = (this._totalSamples / this._sampleRate) * 1000;\n frame[crc32] = this._crc32(frame[data]);\n\n this._headerCache[checkCodecUpdate](\n frame[header][bitrate],\n frame[totalDuration],\n );\n\n this._totalBytesOut += frame[data][length];\n this._totalSamples += frame[samples];\n }\n\n /**\n * @protected\n */\n [mapFrameStats](frame) {\n if (frame[codecFrames]) {\n // Ogg container\n if (frame[isLastPage]) {\n // cut any excess samples that fall outside of the absolute granule position\n // some streams put invalid data in absolute granule position, so only do this\n // for the end of the stream\n let absoluteGranulePositionSamples = frame[samples];\n\n frame[codecFrames].forEach((codecFrame) => {\n const untrimmedCodecSamples = codecFrame[samples];\n\n if (absoluteGranulePositionSamples < untrimmedCodecSamples) {\n codecFrame[samples] =\n absoluteGranulePositionSamples > 0\n ? absoluteGranulePositionSamples\n : 0;\n codecFrame[duration] =\n (codecFrame[samples] / codecFrame[header][sampleRate]) * 1000;\n }\n\n absoluteGranulePositionSamples -= untrimmedCodecSamples;\n\n this[mapCodecFrameStats](codecFrame);\n });\n } else {\n frame[samples] = 0;\n frame[codecFrames].forEach((codecFrame) => {\n frame[samples] += codecFrame[samples];\n this[mapCodecFrameStats](codecFrame);\n });\n }\n\n frame[duration] = (frame[samples] / this._sampleRate) * 1000 || 0;\n frame[totalSamples] = this._totalSamples;\n frame[totalDuration] =\n (this._totalSamples / this._sampleRate) * 1000 || 0;\n frame[totalBytesOut] = this._totalBytesOut;\n } else {\n this[mapCodecFrameStats](frame);\n }\n }\n\n /**\n * @private\n */\n _log(logger, messages) {\n if (this._enableLogging) {\n const stats = [\n `${codec}: ${this[codec]}`,\n `inputMimeType: ${this._inputMimeType}`,\n `readPosition: ${this._currentReadPosition}`,\n `totalBytesIn: ${this._totalBytesIn}`,\n `${totalBytesOut}: ${this._totalBytesOut}`,\n ];\n\n const width = Math.max(...stats.map((s) => s[length]));\n\n messages.push(\n `--stats--${\"-\".repeat(width - 9)}`,\n ...stats,\n \"-\".repeat(width),\n );\n\n logger(\n \"codec-parser\",\n messages.reduce((acc, message) => acc + \"\\n \" + message, \"\"),\n );\n }\n }\n\n /**\n * @protected\n */\n [logWarning](...messages) {\n this._log(console.warn, messages);\n }\n\n /**\n * @protected\n */\n [logError](...messages) {\n this._log(console.error, messages);\n }\n}\n","import CodecParser from \"./src/CodecParser.js\";\nimport * as constants from \"./src/constants.js\";\n\nexport default CodecParser;\n\nexport const absoluteGranulePosition = constants.absoluteGranulePosition;\nexport const bandwidth = constants.bandwidth;\nexport const bitDepth = constants.bitDepth;\nexport const bitrate = constants.bitrate;\nexport const bitrateMaximum = constants.bitrateMaximum;\nexport const bitrateMinimum = constants.bitrateMinimum;\nexport const bitrateNominal = constants.bitrateNominal;\nexport const buffer = constants.buffer;\nexport const bufferFullness = constants.bufferFullness;\nexport const codec = constants.codec;\nexport const codecFrames = constants.codecFrames;\nexport const coupledStreamCount = constants.coupledStreamCount;\nexport const crc = constants.crc;\nexport const crc16 = constants.crc16;\nexport const crc32 = constants.crc32;\nexport const data = constants.data;\nexport const description = constants.description;\nexport const duration = constants.duration;\nexport const emphasis = constants.emphasis;\nexport const hasOpusPadding = constants.hasOpusPadding;\nexport const header = constants.header;\nexport const isContinuedPacket = constants.isContinuedPacket;\nexport const isCopyrighted = constants.isCopyrighted;\nexport const isFirstPage = constants.isFirstPage;\nexport const isHome = constants.isHome;\nexport const isLastPage = constants.isLastPage;\nexport const isOriginal = constants.isOriginal;\nexport const isPrivate = constants.isPrivate;\nexport const isVbr = constants.isVbr;\nexport const layer = constants.layer;\nexport const length = constants.length;\nexport const mode = constants.mode;\nexport const modeExtension = constants.modeExtension;\nexport const mpeg = constants.mpeg;\nexport const mpegVersion = constants.mpegVersion;\nexport const numberAACFrames = constants.numberAACFrames;\nexport const outputGain = constants.outputGain;\nexport const preSkip = constants.preSkip;\nexport const profile = constants.profile;\nexport const protection = constants.protection;\nexport const rawData = constants.rawData;\nexport const segments = constants.segments;\nexport const subarray = constants.subarray;\nexport const version = constants.version;\nexport const vorbis = constants.vorbis;\nexport const vorbisComments = constants.vorbisComments;\nexport const vorbisSetup = constants.vorbisSetup;\nexport const blockingStrategy = constants.blockingStrategy;\nexport const blockSize = constants.blockSize;\nexport const blocksize0 = constants.blocksize0;\nexport const blocksize1 = constants.blocksize1;\nexport const channelMappingFamily = constants.channelMappingFamily;\nexport const channelMappingTable = constants.channelMappingTable;\nexport const channelMode = constants.channelMode;\nexport const channels = constants.channels;\nexport const copyrightId = constants.copyrightId;\nexport const copyrightIdStart = constants.copyrightIdStart;\nexport const frame = constants.frame;\nexport const frameCount = constants.frameCount;\nexport const frameLength = constants.frameLength;\nexport const frameNumber = constants.frameNumber;\nexport const framePadding = constants.framePadding;\nexport const frameSize = constants.frameSize;\nexport const inputSampleRate = constants.inputSampleRate;\nexport const pageChecksum = constants.pageChecksum;\nexport const pageSegmentTable = constants.pageSegmentTable;\nexport const pageSequenceNumber = constants.pageSequenceNumber;\nexport const sampleNumber = constants.sampleNumber;\nexport const sampleRate = constants.sampleRate;\nexport const samples = constants.samples;\nexport const streamCount = constants.streamCount;\nexport const streamInfo = constants.streamInfo;\nexport const streamSerialNumber = constants.streamSerialNumber;\nexport const streamStructureVersion = constants.streamStructureVersion;\nexport const totalBytesOut = constants.totalBytesOut;\nexport const totalDuration = constants.totalDuration;\nexport const totalSamples = constants.totalSamples;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],"mappings":"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"}
Binary file