@mediabunny/server 1.45.5 → 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/bundles/mediabunny-server.cjs +48 -5
- package/dist/bundles/mediabunny-server.min.cjs +2 -2
- package/dist/bundles/mediabunny-server.min.mjs +2 -2
- package/dist/bundles/mediabunny-server.mjs +55 -6
- package/dist/mediabunny-server.d.ts +20 -1
- package/dist/modules/src/audio-sample.d.ts.map +1 -1
- package/dist/modules/src/audio-sample.js +3 -0
- package/dist/modules/src/index.d.ts +21 -2
- package/dist/modules/src/index.d.ts.map +1 -1
- package/dist/modules/src/index.js +20 -2
- package/dist/modules/src/misc.d.ts +2 -2
- package/dist/modules/src/misc.d.ts.map +1 -1
- package/dist/modules/src/misc.js +23 -2
- package/dist/modules/src/video-decoder.js +1 -1
- package/dist/modules/src/video-encoder.js +1 -1
- package/dist/modules/src/video-sample.d.ts.map +1 -1
- package/dist/modules/src/video-sample.js +3 -0
- package/dist/modules/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/audio-sample.ts +3 -0
- package/src/index.ts +59 -2
- package/src/misc.ts +31 -2
- package/src/video-decoder.ts +1 -1
- package/src/video-encoder.ts +1 -1
- package/src/video-sample.ts +3 -0
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
6
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
7
7
|
*/
|
|
8
|
-
import{registerDecoder as rt,registerEncoder as it,registerVideoSampleTransformer as Ut,VideoSample as kt}from"mediabunny";import*as J from"node-av";import{CustomVideoDecoder as lt,VideoSample as dt}from"mediabunny";import*as C from"node-av";import*as n from"node-av";var W={avc:n.AV_CODEC_ID_H264,hevc:n.AV_CODEC_ID_HEVC,vp8:n.AV_CODEC_ID_VP8,vp9:n.AV_CODEC_ID_VP9,av1:n.AV_CODEC_ID_AV1,aac:n.AV_CODEC_ID_AAC,opus:n.AV_CODEC_ID_OPUS,mp3:n.AV_CODEC_ID_MP3,vorbis:n.AV_CODEC_ID_VORBIS,flac:n.AV_CODEC_ID_FLAC,ac3:n.AV_CODEC_ID_AC3,eac3:n.AV_CODEC_ID_EAC3},pe,Be=()=>(pe===void 0&&(pe=n.HardwareContext.auto()),pe),he=new Map,we=t=>{if(!he.has(t)){let e=Be();he.set(t,e?.getDecoderCodec(t)??null)}return he.get(t)},ge=new Map,Te=t=>{if(!ge.has(t)){let e=Be();ge.set(t,e?.getEncoderCodec(t)??null)}return ge.get(t)},Pe=t=>{switch(t){case"bt709":return n.AVCOL_PRI_BT709;case"bt470bg":return n.AVCOL_PRI_BT470BG;case"smpte170m":return n.AVCOL_PRI_SMPTE170M;case"bt2020":return n.AVCOL_PRI_BT2020;case"smpte432":return n.AVCOL_PRI_SMPTE432}return null},ie=t=>{switch(t){case n.AVCOL_PRI_BT709:return"bt709";case n.AVCOL_PRI_BT470BG:return"bt470bg";case n.AVCOL_PRI_SMPTE170M:return"smpte170m";case n.AVCOL_PRI_BT2020:return"bt2020";case n.AVCOL_PRI_SMPTE432:return"smpte432"}return null},Fe=t=>{switch(t){case"bt709":return n.AVCOL_TRC_BT709;case"smpte170m":return n.AVCOL_TRC_SMPTE170M;case"iec61966-2-1":return n.AVCOL_TRC_IEC61966_2_1;case"linear":return n.AVCOL_TRC_LINEAR;case"pq":return n.AVCOL_TRC_SMPTE2084;case"hlg":return n.AVCOL_TRC_ARIB_STD_B67}return null},ne=t=>{switch(t){case n.AVCOL_TRC_BT709:return"bt709";case n.AVCOL_TRC_SMPTE170M:return"smpte170m";case n.AVCOL_TRC_IEC61966_2_1:return"iec61966-2-1";case n.AVCOL_TRC_LINEAR:return"linear";case n.AVCOL_TRC_SMPTE2084:return"pq";case n.AVCOL_TRC_ARIB_STD_B67:return"hlg"}return null},Re=t=>{switch(t){case"rgb":return n.AVCOL_SPC_RGB;case"bt709":return n.AVCOL_SPC_BT709;case"bt470bg":return n.AVCOL_SPC_BT470BG;case"smpte170m":return n.AVCOL_SPC_SMPTE170M;case"bt2020-ncl":return n.AVCOL_SPC_BT2020_NCL}return null},oe=t=>{switch(t){case n.AVCOL_SPC_RGB:return"rgb";case n.AVCOL_SPC_BT709:return"bt709";case n.AVCOL_SPC_BT470BG:return"bt470bg";case n.AVCOL_SPC_SMPTE170M:return"smpte170m";case n.AVCOL_SPC_BT2020_NCL:return"bt2020-ncl"}return null},Ve=t=>{switch(t){case n.AV_PIX_FMT_YUV420P:return"I420";case n.AV_PIX_FMT_YUVJ420P:return"I420";case n.AV_PIX_FMT_YUV420P10LE:return"I420P10";case n.AV_PIX_FMT_YUV420P12LE:return"I420P12";case n.AV_PIX_FMT_YUVA420P:return"I420A";case n.AV_PIX_FMT_YUVA420P10LE:return"I420AP10";case n.AV_PIX_FMT_YUV422P:return"I422";case n.AV_PIX_FMT_YUVJ422P:return"I422";case n.AV_PIX_FMT_YUV422P10LE:return"I422P10";case n.AV_PIX_FMT_YUV422P12LE:return"I422P12";case n.AV_PIX_FMT_YUVA422P:return"I422A";case n.AV_PIX_FMT_YUVA422P10LE:return"I422AP10";case n.AV_PIX_FMT_YUVA422P12LE:return"I422AP12";case n.AV_PIX_FMT_YUV444P:return"I444";case n.AV_PIX_FMT_YUVJ444P:return"I444";case n.AV_PIX_FMT_YUV444P10LE:return"I444P10";case n.AV_PIX_FMT_YUV444P12LE:return"I444P12";case n.AV_PIX_FMT_YUVA444P:return"I444A";case n.AV_PIX_FMT_YUVA444P10LE:return"I444AP10";case n.AV_PIX_FMT_YUVA444P12LE:return"I444AP12";case n.AV_PIX_FMT_NV12:return"NV12";case n.AV_PIX_FMT_RGBA:return"RGBA";case n.AV_PIX_FMT_RGB0:return"RGBX";case n.AV_PIX_FMT_BGRA:return"BGRA";case n.AV_PIX_FMT_BGR0:return"BGRX";default:return null}},be=t=>{switch(t){case"I420":return n.AV_PIX_FMT_YUV420P;case"I420P10":return n.AV_PIX_FMT_YUV420P10LE;case"I420P12":return n.AV_PIX_FMT_YUV420P12LE;case"I420A":return n.AV_PIX_FMT_YUVA420P;case"I420AP10":return n.AV_PIX_FMT_YUVA420P10LE;case"I422":return n.AV_PIX_FMT_YUV422P;case"I422P10":return n.AV_PIX_FMT_YUV422P10LE;case"I422P12":return n.AV_PIX_FMT_YUV422P12LE;case"I422A":return n.AV_PIX_FMT_YUVA422P;case"I422AP10":return n.AV_PIX_FMT_YUVA422P10LE;case"I422AP12":return n.AV_PIX_FMT_YUVA422P12LE;case"I444":return n.AV_PIX_FMT_YUV444P;case"I444P10":return n.AV_PIX_FMT_YUV444P10LE;case"I444P12":return n.AV_PIX_FMT_YUV444P12LE;case"I444A":return n.AV_PIX_FMT_YUVA444P;case"I444AP10":return n.AV_PIX_FMT_YUVA444P10LE;case"I444AP12":return n.AV_PIX_FMT_YUVA444P12LE;case"NV12":return n.AV_PIX_FMT_NV12;case"RGBA":return n.AV_PIX_FMT_RGBA;case"RGBX":return n.AV_PIX_FMT_RGB0;case"BGRA":return n.AV_PIX_FMT_BGRA;case"BGRX":return n.AV_PIX_FMT_BGR0;default:return n.AV_PIX_FMT_NONE}},Ne=t=>{switch(t){case n.AV_SAMPLE_FMT_U8:return"u8";case n.AV_SAMPLE_FMT_S16:return"s16";case n.AV_SAMPLE_FMT_S32:return"s32";case n.AV_SAMPLE_FMT_FLT:return"f32";case n.AV_SAMPLE_FMT_U8P:return"u8-planar";case n.AV_SAMPLE_FMT_S16P:return"s16-planar";case n.AV_SAMPLE_FMT_S32P:return"s32-planar";case n.AV_SAMPLE_FMT_FLTP:return"f32-planar";default:return null}},Me=t=>{switch(t){case"u8":return n.AV_SAMPLE_FMT_U8;case"s16":return n.AV_SAMPLE_FMT_S16;case"s32":return n.AV_SAMPLE_FMT_S32;case"f32":return n.AV_SAMPLE_FMT_FLT;case"u8-planar":return n.AV_SAMPLE_FMT_U8P;case"s16-planar":return n.AV_SAMPLE_FMT_S16P;case"s32-planar":return n.AV_SAMPLE_FMT_S32P;case"f32-planar":return n.AV_SAMPLE_FMT_FLTP;default:return n.AV_SAMPLE_FMT_NONE}},Y=t=>{switch(t){case 1:return n.AV_CHANNEL_LAYOUT_MONO;case 2:return n.AV_CHANNEL_LAYOUT_STEREO;case 4:return n.AV_CHANNEL_LAYOUT_QUAD;case 6:return n.AV_CHANNEL_LAYOUT_5POINT1_BACK;case 8:return n.AV_CHANNEL_LAYOUT_7POINT1;default:return{nbChannels:t,order:n.AV_CHANNEL_ORDER_UNSPEC,mask:0n}}};function p(t){if(!t)throw new Error("Assertion failed.")}var $=t=>t&&t[t.length-1];var l=t=>{let e=0;for(;t.readBits(1)===0&&e<32;)e++;if(e>=32)throw new Error("Invalid exponential-Golomb code.");return(1<<e)-1+t.readBits(e)},q=t=>{let e=l(t);return(e&1)===0?-(e>>1):e+1>>1};var M=t=>t.constructor===Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),Ce=t=>t.constructor===DataView?t:ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t);var Ue={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12};var ke={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18};var Le={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9};var xe=t=>[...t].map(e=>e.toString(16).padStart(2,"0")).join("");var ve=t=>(t=t>>1&1431655765|(t&1431655765)<<1,t=t>>2&858993459|(t&858993459)<<2,t=t>>4&252645135|(t&252645135)<<4,t=t>>8&16711935|(t&16711935)<<8,t=t>>16&65535|(t&65535)<<16,t>>>0);var j=(t,e,r)=>{let i=0,o=t.length-1,s=-1;for(;i<=o;){let a=i+(o-i+1)/2|0;r(t[a])<=e?(s=a,i=a+1):o=a-1}return s};var Dt=1e6*(1+Number.EPSILON);var se=t=>{p(Number.isInteger(t.num)),p(Number.isInteger(t.den)),p(t.den!==0);let e=Math.abs(t.num),r=Math.abs(t.den);for(;r!==0;){let o=e%r;e=r,r=o}let i=e||1;return{num:t.num/i,den:t.den/i}};import{VideoSampleResource as st,VideoSampleColorSpace as at,VideoSample as De}from"mediabunny";import*as f from"node-av";var ct=new Set([f.AV_PIX_FMT_YUVJ411P,f.AV_PIX_FMT_YUVJ420P,f.AV_PIX_FMT_YUVJ422P,f.AV_PIX_FMT_YUVJ440P,f.AV_PIX_FMT_YUVJ444P]),z=class t extends st{get frame(){if(!this._frame)throw new Error("AvFrameVideoSampleResource has been closed.");return this._frame}constructor(e){if(super(),e.getMediaType()!==f.AVMEDIA_TYPE_VIDEO)throw new Error("AvFrameVideoSampleResource must be initialized with a video frame.");this._frame=e}getFormat(){return Ve(this.frame.format)}getCodedWidth(){return this.frame.width}getCodedHeight(){return this.frame.height}getSquarePixelWidth(){return this.frame.sampleAspectRatio.num>this.frame.sampleAspectRatio.den?Math.round(this.frame.width*this.frame.sampleAspectRatio.num/this.frame.sampleAspectRatio.den):this.frame.width}getSquarePixelHeight(){return this.frame.sampleAspectRatio.num>this.frame.sampleAspectRatio.den?this.frame.height:Math.round(this.frame.height*this.frame.sampleAspectRatio.den/this.frame.sampleAspectRatio.num)}getColorSpace(){return new at({primaries:ie(this.frame.colorPrimaries),transfer:ne(this.frame.colorTrc),matrix:oe(this.frame.colorSpace),fullRange:this.frame.colorRange===f.AVCOL_RANGE_JPEG||ct.has(this.frame.format)?!0:this.frame.colorRange===f.AVCOL_RANGE_MPEG?!1:null})}close(){this.frame.free(),this._frame=null}getDataPlanes(){return p(this.frame.data),this.frame.data.map((e,r)=>({data:M(e),stride:this.frame.linesize[r]}))}async toRgbSample(e,r){let i=this.frame.width,o=this.frame.height,s=new f.SoftwareScaleContext,a=this.frame.format,A=be("RGBA");s.getContext(i,o,a,i,o,A,f.SWS_BILINEAR);let u=new f.Frame;u.width=i,u.height=o,u.format=A,u.alloc(),u.allocBuffer();let d=this.frame;try{await s.scaleFrame(u,d)}finally{s.freeContext()}return u.sampleAspectRatio=d.sampleAspectRatio,new De(new t(u),e)}},ee=async(t,e,r)=>{p(t.format!==null),e.format=be(t.format),e.width=t.codedWidth,e.height=t.codedHeight,e.sampleAspectRatio=new f.Rational(t.pixelAspectRatio.num,t.pixelAspectRatio.den),e.colorPrimaries=Pe(t.colorSpace.primaries??"unknown")??f.AVCOL_PRI_UNSPECIFIED,e.colorSpace=Re(t.colorSpace.matrix??"unknown")??f.AVCOL_SPC_UNSPECIFIED,e.colorTrc=Fe(t.colorSpace.transfer??"unknown")??f.AVCOL_TRC_UNSPECIFIED,e.colorRange=t.colorSpace.fullRange===!1?f.AVCOL_RANGE_MPEG:t.colorSpace.fullRange===!0?f.AVCOL_RANGE_JPEG:f.AVCOL_RANGE_UNSPECIFIED;let i=t.allocationSize();return(!r||r.byteLength!==i)&&(r=Buffer.from({length:i})),await t.copyTo(r),e.fromBuffer(r),r},Oe=async(t,e)=>{let r,i=!1;if(t._data instanceof z)r=t._data.frame;else{if(t.format===null)return null;r=new f.Frame,r.alloc(),i=!0,await ee(t,r,null)}let o=[];(t.squarePixelWidth!==t.codedWidth||t.squarePixelHeight!==t.codedHeight)&&(o.push(`scale=${t.squarePixelWidth}:${t.squarePixelHeight}`),o.push("setsar=1")),e.rotation===90?o.push("transpose=1"):e.rotation===180?o.push("transpose=1,transpose=1"):e.rotation===270&&o.push("transpose=2"),o.push(`crop=${Math.round(e.crop.width)}:${Math.round(e.crop.height)}:${Math.round(e.crop.left)}:${Math.round(e.crop.top)}`),e.fit==="fill"?o.push(`scale=${e.width}:${e.height}`):e.fit==="contain"?(o.push(`scale=${e.width}:${e.height}:force_original_aspect_ratio=decrease`),o.push(`pad=${e.width}:${e.height}:(ow-iw)/2:(oh-ih)/2:color=black@0`)):e.fit==="cover"&&(o.push(`scale=${e.width}:${e.height}:force_original_aspect_ratio=increase`),o.push(`crop=${e.width}:${e.height}`)),o.push("setsar=1");let s=new f.FilterGraph;s.alloc();try{let a=`video_size=${r.width}x${r.height}:pix_fmt=${r.format}:time_base=1/1000000:pixel_aspect=${t.pixelAspectRatio.num}/${t.pixelAspectRatio.den}`,A=s.createFilter(f.Filter.getByName("buffer"),"src",a),u=s.createFilter(f.Filter.getByName("buffersink"),"sink");p(A&&u);let d=f.FilterInOut.createList([{name:"in",filterCtx:A,padIdx:0}]),c=f.FilterInOut.createList([{name:"out",filterCtx:u,padIdx:0}]),h=s.parsePtr(`[in]${o.join(",")}[out]`,c,d);f.FFmpegError.throwIfError(h,"FilterGraph.parsePtr");let I=await s.config();f.FFmpegError.throwIfError(I,"FilterGraph.config");let _=await A.buffersrcAddFrame(r);f.FFmpegError.throwIfError(_,"buffersrcAddFrame"),await A.buffersrcAddFrame(null);let g=new f.Frame;g.alloc();let x=await u.buffersinkGetFrame(g);return f.FFmpegError.throwIfError(x,"buffersinkGetFrame"),new De(new z(g),{timestamp:t.timestamp,duration:t.duration,rotation:0})}finally{s.free(),i&&r.free()}};var ae=class extends lt{constructor(){super(...arguments);this.codecContext=null;this.preciseTimings=[]}static supports(r,i){return r==="avc"||r==="hevc"||r==="vp8"||r==="vp9"||r==="av1"}async init(){this.frame=new C.Frame,this.frame.alloc(),this.packet=new C.Packet,this.packet.alloc()}async initCodecContext(r){p(this.codecContext===null);let i=W[this.codec];p(i!==void 0);let o;if(this.codec==="vp9"&&r.sideData.alpha?o=C.Codec.findDecoderByName(C.FF_DECODER_LIBVPX_VP9)??C.Codec.findDecoder(i):this.config.hardwareAcceleration==="prefer-software"||this.codec==="av1"?o=C.Codec.findDecoder(i):o=we(i)??C.Codec.findDecoder(i),!o)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let s=new C.CodecContext;s.allocContext3(o),this.pixelAspectRatio=se({num:(this.config.displayAspectWidth??this.config.codedWidth??0)*(this.config.codedHeight??0),den:(this.config.displayAspectHeight??this.config.codedHeight??0)*(this.config.codedWidth??0)||1}),s.width=this.config.codedWidth??0,s.height=this.config.codedHeight??0,s.codecType=C.AVMEDIA_TYPE_VIDEO,s.codecId=i,s.extraData=this.config.description?Buffer.from(M(this.config.description)):null,s.sampleAspectRatio=new C.Rational(this.pixelAspectRatio.num,this.pixelAspectRatio.den);let a=await s.open2();C.FFmpegError.throwIfError(a,"Open codec context"),this.codecContext=s}async decode(r){if(this.codecContext===null&&await this.initCodecContext(r),p(this.codecContext),this.packet.isKeyframe=r.type==="key",this.packet.data=Buffer.from(r.data),this.packet.timeBase={num:1,den:1e6},this.packet.pts=BigInt(r.microsecondTimestamp),this.packet.dts=C.AV_NOPTS_VALUE,this.packet.duration=BigInt(r.microsecondDuration),r.sideData.alpha){let a=Buffer.alloc(8+r.sideData.alpha.byteLength);a[7]=1,a.set(r.sideData.alpha,8),this.packet.addSideData(C.AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,a)}let i=j(this.preciseTimings,r.microsecondTimestamp,a=>a.microsecondTimestamp),o=i!==-1?this.preciseTimings[i]:null;o&&o.microsecondTimestamp===r.microsecondTimestamp?(o.timestamp!==r.timestamp&&(o.timestampIsValid=!1),o.duration!==r.duration&&(o.durationIsValid=!1)):(this.preciseTimings.splice(i+1,0,{microsecondTimestamp:r.microsecondTimestamp,timestamp:r.timestamp,duration:r.duration,timestampIsValid:!0,durationIsValid:!0}),this.preciseTimings.length>128&&this.preciseTimings.shift());let s=await this.codecContext.sendPacket(this.packet);for(C.FFmpegError.throwIfError(s,"Send packet"),this.packet.unref();;){let a=await this.codecContext.receiveFrame(this.frame);if(a===C.AVERROR_EAGAIN||a===C.AVERROR_EOF)break;this.receiveFrame(a)}}receiveFrame(r){C.FFmpegError.throwIfError(r,"Receive frame"),this.frame.sampleAspectRatio=new C.Rational(this.pixelAspectRatio.num,this.pixelAspectRatio.den);let i=Number(this.frame.pts)/1e6,o=Number(this.frame.duration)/1e6,s=j(this.preciseTimings,Number(this.frame.pts),u=>u.microsecondTimestamp),a=s!==-1?this.preciseTimings[s]:null;a&&a.microsecondTimestamp===Number(this.frame.pts)&&(a.timestampIsValid&&(i=a.timestamp),a.durationIsValid&&(o=a.duration));let A=this.frame.clone();if(!A)throw new Error("Frame clone allocation failed.");this.onSample(new dt(new z(A),{timestamp:i,duration:o}))}async flush(){if(!this.codecContext)return;let r=await this.codecContext.sendPacket(null);for(C.FFmpegError.throwIfError(r,"Flush decoder");;){let i=await this.codecContext.receiveFrame(this.frame);if(i===C.AVERROR_EAGAIN||i===C.AVERROR_EOF)break;this.receiveFrame(i)}this.codecContext.flushBuffers()}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free()}};import{CustomVideoEncoder as It,QUALITY_MEDIUM as _t,EncodedPacket as Et}from"mediabunny";import*as m from"node-av";var O=class t{constructor(e){this.bytes=e;this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,i=7-(this.pos&7),o=(r&1<<i)>>i;return this.pos++,o}readBits(e){if(e===1)return this.readBit();let r=0;for(let i=0;i<e;i++)r<<=1,r|=this.readBit();return r}writeBits(e,r){let i=this.pos+e;for(let o=this.pos;o<i;o++){let s=Math.floor(o/8),a=this.bytes[s],A=7-(o&7);a&=~(1<<A),a|=(r&1<<i-o-1)>>i-o-1<<A,this.bytes[s]=a}this.pos=i}readAlignedByte(){if(this.pos%8!==0)throw new Error("Bitstream is not byte-aligned.");let e=this.pos/8,r=this.bytes[e]??0;return this.pos+=8,r}skipBits(e){this.pos+=e}getBitsLeft(){return this.bytes.length*8-this.pos}clone(){let e=new t(this.bytes);return e.pos=this.pos,e}};var ze=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],At=[-1,1,2,3,4,5,6,8],He=t=>{if(!t||t.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=new O(t),r=e.readBits(5);r===31&&(r=32+e.readBits(6));let i=e.readBits(4),o=null;i===15?o=e.readBits(24):i<ze.length&&(o=ze[i]);let s=e.readBits(4),a=null;return s>=1&&s<=7&&(a=At[s]),{objectType:r,frequencyIndex:i,sampleRate:o,channelConfiguration:s,numberOfChannels:a}};var qe=t=>{let e=new Uint8Array(7),r=new O(e),{objectType:i,frequencyIndex:o,channelConfiguration:s}=t,a=i-1;return r.writeBits(12,4095),r.writeBits(1,0),r.writeBits(2,0),r.writeBits(1,1),r.writeBits(2,a),r.writeBits(4,o),r.writeBits(1,0),r.writeBits(3,s),r.writeBits(1,0),r.writeBits(1,0),r.writeBits(1,0),r.writeBits(1,0),r.skipBits(13),r.writeBits(11,2047),r.writeBits(2,0),{header:e,bitstream:r}};var mt=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],ft=["aac","opus","mp3","vorbis","flac","ac3","eac3"],lr=[...ft,...mt];var ye=[{maxMacroblocks:99,maxBitrate:64e3,maxDpbMbs:396,level:10},{maxMacroblocks:396,maxBitrate:192e3,maxDpbMbs:900,level:11},{maxMacroblocks:396,maxBitrate:384e3,maxDpbMbs:2376,level:12},{maxMacroblocks:396,maxBitrate:768e3,maxDpbMbs:2376,level:13},{maxMacroblocks:396,maxBitrate:2e6,maxDpbMbs:2376,level:20},{maxMacroblocks:792,maxBitrate:4e6,maxDpbMbs:4752,level:21},{maxMacroblocks:1620,maxBitrate:4e6,maxDpbMbs:8100,level:22},{maxMacroblocks:1620,maxBitrate:1e7,maxDpbMbs:8100,level:30},{maxMacroblocks:3600,maxBitrate:14e6,maxDpbMbs:18e3,level:31},{maxMacroblocks:5120,maxBitrate:2e7,maxDpbMbs:20480,level:32},{maxMacroblocks:8192,maxBitrate:2e7,maxDpbMbs:32768,level:40},{maxMacroblocks:8192,maxBitrate:5e7,maxDpbMbs:32768,level:41},{maxMacroblocks:8704,maxBitrate:5e7,maxDpbMbs:34816,level:42},{maxMacroblocks:22080,maxBitrate:135e6,maxDpbMbs:110400,level:50},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:51},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:52},{maxMacroblocks:139264,maxBitrate:24e7,maxDpbMbs:696320,level:60},{maxMacroblocks:139264,maxBitrate:48e7,maxDpbMbs:696320,level:61},{maxMacroblocks:139264,maxBitrate:8e8,maxDpbMbs:696320,level:62}];var Q=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:35651584,maxBitrate:18e7,level:60},{maxPictureSize:35651584,maxBitrate:24e7,level:61},{maxPictureSize:35651584,maxBitrate:48e7,level:62}];var We=".01.01.01.01.00",Ge=".0.110.01.01.01.0";var te=t=>{let{codec:e,codecDescription:r,colorSpace:i,avcCodecInfo:o,hevcCodecInfo:s,vp9CodecInfo:a,av1CodecInfo:A}=t;if(e==="avc"){if(p(t.avcType!==null),o){let u=new Uint8Array([o.avcProfileIndication,o.profileCompatibility,o.avcLevelIndication]);return`avc${t.avcType}.${xe(u)}`}if(!r||r.byteLength<4)throw new TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${t.avcType}.${xe(r.subarray(1,4))}`}else if(e==="hevc"){let u,d,c,h,I,_;if(s)u=s.generalProfileSpace,d=s.generalProfileIdc,c=ve(s.generalProfileCompatibilityFlags),h=s.generalTierFlag,I=s.generalLevelIdc,_=[...s.generalConstraintIndicatorFlags];else{if(!r||r.byteLength<23)throw new TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let x=Ce(r),b=x.getUint8(1);u=b>>6&3,d=b&31,c=ve(x.getUint32(2)),h=b>>5&1,I=x.getUint8(12),_=[];for(let T=0;T<6;T++)_.push(x.getUint8(6+T))}let g="hev1.";for(g+=["","A","B","C"][u]+d,g+=".",g+=c.toString(16).toUpperCase(),g+=".",g+=h===0?"L":"H",g+=I;_.length>0&&_[_.length-1]===0;)_.pop();return _.length>0&&(g+=".",g+=_.map(x=>x.toString(16).toUpperCase()).join(".")),g}else{if(e==="vp8")return"vp8";if(e==="vp9"){if(!a){let T=t.width*t.height,y=$(Q).level;for(let P of Q)if(T<=P.maxPictureSize){y=P.level;break}return`vp09.00.${y.toString().padStart(2,"0")}.08`}let u=a.profile.toString().padStart(2,"0"),d=a.level.toString().padStart(2,"0"),c=a.bitDepth.toString().padStart(2,"0"),h=a.chromaSubsampling.toString().padStart(2,"0"),I=a.colourPrimaries.toString().padStart(2,"0"),_=a.transferCharacteristics.toString().padStart(2,"0"),g=a.matrixCoefficients.toString().padStart(2,"0"),x=a.videoFullRangeFlag.toString().padStart(2,"0"),b=`vp09.${u}.${d}.${c}.${h}`;return b+=`.${I}.${_}.${g}.${x}`,b.endsWith(We)&&(b=b.slice(0,-We.length)),b}else if(e==="av1"){if(!A){let P=t.width*t.height,V=$(Q).level;for(let E of Q)if(P<=E.maxPictureSize){V=E.level;break}return`av01.0.${V.toString().padStart(2,"0")}M.08`}let u=A.profile,d=A.level.toString().padStart(2,"0"),c=A.tier?"H":"M",h=A.bitDepth.toString().padStart(2,"0"),I=A.monochrome?"1":"0",_=100*A.chromaSubsamplingX+10*A.chromaSubsamplingY+1*(A.chromaSubsamplingX&&A.chromaSubsamplingY?A.chromaSamplePosition:0),g=i?.primaries?Ue[i.primaries]:1,x=i?.transfer?ke[i.transfer]:1,b=i?.matrix?Le[i.matrix]:1,T=i?.fullRange?1:0,y=`av01.${u}.${d}${c}.${h}`;return y+=`.${I}.${_.toString().padStart(3,"0")}`,y+=`.${g.toString().padStart(2,"0")}`,y+=`.${x.toString().padStart(2,"0")}`,y+=`.${b.toString().padStart(2,"0")}`,y+=`.${T}`,y.endsWith(Ge)&&(y=y.slice(0,-Ge.length)),y}}throw new TypeError(`Unhandled codec '${e}'.`)};var le=function*(t){let e=0,r=-1;for(;e<t.length-2;){let i=t.indexOf(0,e);if(i===-1||i>=t.length-2)break;e=i;let o=0;if(e+3<t.length&&t[e+1]===0&&t[e+2]===0&&t[e+3]===1?o=4:t[e+1]===0&&t[e+2]===1&&(o=3),o===0){e++;continue}r!==-1&&e>r&&(yield{offset:r,length:e-r}),r=e+o,e=r}r!==-1&&r<t.length&&(yield{offset:r,length:t.length-r})};var Se=t=>t&31,Ie=t=>{let e=[],r=t.length;for(let i=0;i<r;i++)i+2<r&&t[i]===0&&t[i+1]===0&&t[i+2]===3?(e.push(0,0),i+=2):e.push(t[i]);return new Uint8Array(e)},_r=new Uint8Array([0,0,0,1]);var Ke=t=>{try{let e=[],r=[],i=[];for(let A of le(t)){let u=t.subarray(A.offset,A.offset+A.length),d=Se(u[0]);d===7?e.push(u):d===8?r.push(u):d===13&&i.push(u)}if(e.length===0||r.length===0)return null;let o=e[0],s=pt(o);p(s!==null);let a=s.profileIdc===100||s.profileIdc===110||s.profileIdc===122||s.profileIdc===144;return{configurationVersion:1,avcProfileIndication:s.profileIdc,profileCompatibility:s.constraintFlags,avcLevelIndication:s.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:e,pictureParameterSets:r,chromaFormat:a?s.chromaFormatIdc:null,bitDepthLumaMinus8:a?s.bitDepthLumaMinus8:null,bitDepthChromaMinus8:a?s.bitDepthChromaMinus8:null,sequenceParameterSetExt:a?i:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},Qe=t=>{let e=[];e.push(t.configurationVersion),e.push(t.avcProfileIndication),e.push(t.profileCompatibility),e.push(t.avcLevelIndication),e.push(252|t.lengthSizeMinusOne&3),e.push(224|t.sequenceParameterSets.length&31);for(let r of t.sequenceParameterSets){let i=r.byteLength;e.push(i>>8),e.push(i&255);for(let o=0;o<i;o++)e.push(r[o])}e.push(t.pictureParameterSets.length);for(let r of t.pictureParameterSets){let i=r.byteLength;e.push(i>>8),e.push(i&255);for(let o=0;o<i;o++)e.push(r[o])}if(t.avcProfileIndication===100||t.avcProfileIndication===110||t.avcProfileIndication===122||t.avcProfileIndication===144){p(t.chromaFormat!==null),p(t.bitDepthLumaMinus8!==null),p(t.bitDepthChromaMinus8!==null),p(t.sequenceParameterSetExt!==null),e.push(252|t.chromaFormat&3),e.push(248|t.bitDepthLumaMinus8&7),e.push(248|t.bitDepthChromaMinus8&7),e.push(t.sequenceParameterSetExt.length);for(let r of t.sequenceParameterSetExt){let i=r.byteLength;e.push(i>>8),e.push(i&255);for(let o=0;o<i;o++)e.push(r[o])}}return new Uint8Array(e)};var Je={1:{num:1,den:1},2:{num:12,den:11},3:{num:10,den:11},4:{num:16,den:11},5:{num:40,den:33},6:{num:24,den:11},7:{num:20,den:11},8:{num:32,den:11},9:{num:80,den:33},10:{num:18,den:11},11:{num:15,den:11},12:{num:64,den:33},13:{num:160,den:99},14:{num:4,den:3},15:{num:3,den:2},16:{num:2,den:1}},pt=t=>{try{let e=new O(Ie(t));if(e.skipBits(1),e.skipBits(2),e.readBits(5)!==7)return null;let i=e.readAlignedByte(),o=e.readAlignedByte(),s=e.readAlignedByte();l(e);let a=1,A=0,u=0,d=0;if((i===100||i===110||i===122||i===244||i===44||i===83||i===86||i===118||i===128)&&(a=l(e),a===3&&(d=e.readBits(1)),A=l(e),u=l(e),e.skipBits(1),e.readBits(1))){for(let S=0;S<(a!==3?8:12);S++)if(e.readBits(1)){let X=S<6?16:64,L=8,R=8;for(let D=0;D<X;D++){if(R!==0){let K=q(e);R=(L+K+256)%256}L=R===0?L:R}}}l(e);let c=l(e);if(c===0)l(e);else if(c===1){e.skipBits(1),q(e),q(e);let U=l(e);for(let S=0;S<U;S++)q(e)}l(e),e.skipBits(1);let h=l(e),I=l(e),_=16*(h+1),g=16*(I+1),x=_,b=g,T=e.readBits(1);if(T||e.skipBits(1),e.skipBits(1),e.readBits(1)){let U=l(e),S=l(e),H=l(e),X=l(e),L,R;if((d===0?a:0)===0)L=1,R=2-T;else{let K=a===3?1:2,Z=a===1?2:1;L=K,R=Z*(2-T)}x-=L*(U+S),b-=R*(H+X)}let P=2,V=2,E=2,w=0,N={num:1,den:1},F=null,k=null;if(e.readBits(1)){if(e.readBits(1)){let Z=e.readBits(8);if(Z===255)N={num:e.readBits(16),den:e.readBits(16)};else{let Ee=Je[Z];Ee&&(N=Ee)}}e.readBits(1)&&e.skipBits(1),e.readBits(1)&&(e.skipBits(3),w=e.readBits(1),e.readBits(1)&&(P=e.readBits(8),V=e.readBits(8),E=e.readBits(8))),e.readBits(1)&&(l(e),l(e)),e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.skipBits(1));let R=e.readBits(1);R&&Xe(e);let D=e.readBits(1);D&&Xe(e),(R||D)&&e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(1),l(e),l(e),l(e),l(e),F=l(e),k=l(e))}if(F===null){p(k===null);let U=o&16;if((i===44||i===86||i===100||i===110||i===122||i===244)&&U)F=0,k=0;else{let S=h+1,H=I+1,X=(2-T)*H,L=ye.find(D=>D.level>=s)??$(ye),R=Math.min(Math.floor(L.maxDpbMbs/(S*X)),16);F=R,k=R}}return p(k!==null),{profileIdc:i,constraintFlags:o,levelIdc:s,frameMbsOnlyFlag:T,chromaFormatIdc:a,bitDepthLumaMinus8:A,bitDepthChromaMinus8:u,codedWidth:_,codedHeight:g,displayWidth:x,displayHeight:b,pixelAspectRatio:N,colourPrimaries:P,matrixCoefficients:E,transferCharacteristics:V,fullRangeFlag:w,numReorderFrames:F,maxDecFrameBuffering:k}}catch(e){return console.error("Error parsing AVC SPS:",e),null}},Xe=t=>{let e=l(t);t.skipBits(4),t.skipBits(4);for(let r=0;r<=e;r++)l(t),l(t),t.skipBits(1);t.skipBits(5),t.skipBits(5),t.skipBits(5),t.skipBits(5)};var ce=t=>t>>1&63,ht=t=>{try{let e=new O(Ie(t));e.skipBits(16),e.readBits(4);let r=e.readBits(3),i=e.readBits(1),{general_profile_space:o,general_tier_flag:s,general_profile_idc:a,general_profile_compatibility_flags:A,general_constraint_indicator_flags:u,general_level_idc:d}=gt(e,r);l(e);let c=l(e),h=0;c===3&&(h=e.readBits(1));let I=l(e),_=l(e),g=I,x=_;if(e.readBits(1)){let S=l(e),H=l(e),X=l(e),L=l(e),R=1,D=1,K=h===0?c:0;K===1?(R=2,D=2):K===2&&(R=2,D=1),g-=(S+H)*R,x-=(X+L)*D}let b=l(e),T=l(e);l(e);let P=e.readBits(1)?0:r,V=0;for(let S=P;S<=r;S++)l(e),V=l(e),l(e);l(e),l(e),l(e),l(e),l(e),l(e),e.readBits(1)&&e.readBits(1)&&bt(e),e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(4),e.skipBits(4),l(e),l(e),e.skipBits(1));let E=l(e);if(Ct(e,E),e.readBits(1)){let S=l(e);for(let H=0;H<S;H++)l(e),e.skipBits(1)}e.skipBits(1),e.skipBits(1);let w=2,N=2,F=2,k=0,re=0,U={num:1,den:1};if(e.readBits(1)){let S=vt(e,r);U=S.pixelAspectRatio,w=S.colourPrimaries,N=S.transferCharacteristics,F=S.matrixCoefficients,k=S.fullRangeFlag,re=S.minSpatialSegmentationIdc}return{displayWidth:g,displayHeight:x,pixelAspectRatio:U,colourPrimaries:w,transferCharacteristics:N,matrixCoefficients:F,fullRangeFlag:k,maxDecFrameBuffering:V+1,spsMaxSubLayersMinus1:r,spsTemporalIdNestingFlag:i,generalProfileSpace:o,generalTierFlag:s,generalProfileIdc:a,generalProfileCompatibilityFlags:A,generalConstraintIndicatorFlags:u,generalLevelIdc:d,chromaFormatIdc:c,bitDepthLumaMinus8:b,bitDepthChromaMinus8:T,minSpatialSegmentationIdc:re}}catch(e){return console.error("Error parsing HEVC SPS:",e),null}},$e=t=>{try{let e=[],r=[],i=[],o=[];for(let d of le(t)){let c=t.subarray(d.offset,d.offset+d.length),h=ce(c[0]);h===32?e.push(c):h===33?r.push(c):h===34?i.push(c):(h===39||h===40)&&o.push(c)}if(r.length===0||i.length===0)return null;let s=ht(r[0]);if(!s)return null;let a=0;if(i.length>0){let d=i[0],c=new O(Ie(d));c.skipBits(16),l(c),l(c),c.skipBits(1),c.skipBits(1),c.skipBits(3),c.skipBits(1),c.skipBits(1),l(c),l(c),q(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&l(c),q(c),q(c),c.skipBits(1),c.skipBits(1),c.skipBits(1),c.skipBits(1);let h=c.readBits(1),I=c.readBits(1);!h&&!I?a=0:h&&!I?a=2:!h&&I?a=3:a=0}let A=[...e.length?[{arrayCompleteness:1,nalUnitType:32,nalUnits:e}]:[],...r.length?[{arrayCompleteness:1,nalUnitType:33,nalUnits:r}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:34,nalUnits:i}]:[],...o.length?[{arrayCompleteness:1,nalUnitType:ce(o[0][0]),nalUnits:o}]:[]];return{configurationVersion:1,generalProfileSpace:s.generalProfileSpace,generalTierFlag:s.generalTierFlag,generalProfileIdc:s.generalProfileIdc,generalProfileCompatibilityFlags:s.generalProfileCompatibilityFlags,generalConstraintIndicatorFlags:s.generalConstraintIndicatorFlags,generalLevelIdc:s.generalLevelIdc,minSpatialSegmentationIdc:s.minSpatialSegmentationIdc,parallelismType:a,chromaFormatIdc:s.chromaFormatIdc,bitDepthLumaMinus8:s.bitDepthLumaMinus8,bitDepthChromaMinus8:s.bitDepthChromaMinus8,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:s.spsMaxSubLayersMinus1+1,temporalIdNested:s.spsTemporalIdNestingFlag,lengthSizeMinusOne:3,arrays:A}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},gt=(t,e)=>{let r=t.readBits(2),i=t.readBits(1),o=t.readBits(5),s=0;for(let c=0;c<32;c++)s=s<<1|t.readBits(1);let a=new Uint8Array(6);for(let c=0;c<6;c++)a[c]=t.readBits(8);let A=t.readBits(8),u=[],d=[];for(let c=0;c<e;c++)u.push(t.readBits(1)),d.push(t.readBits(1));if(e>0)for(let c=e;c<8;c++)t.skipBits(2);for(let c=0;c<e;c++)u[c]&&t.skipBits(88),d[c]&&t.skipBits(8);return{general_profile_space:r,general_tier_flag:i,general_profile_idc:o,general_profile_compatibility_flags:s,general_constraint_indicator_flags:a,general_level_idc:A}},bt=t=>{for(let e=0;e<4;e++)for(let r=0;r<(e===3?2:6);r++)if(!t.readBits(1))l(t);else{let o=Math.min(64,1<<4+(e<<1));e>1&&q(t);for(let s=0;s<o;s++)q(t)}},Ct=(t,e)=>{let r=[];for(let i=0;i<e;i++)r[i]=xt(t,i,e,r)},xt=(t,e,r,i)=>{let o=0,s=0,a=0;if(e!==0&&(s=t.readBits(1)),s){if(e===r){let u=l(t);a=e-(u+1)}else a=e-1;t.readBits(1),l(t);let A=i[a]??0;for(let u=0;u<=A;u++)t.readBits(1)||t.readBits(1);o=i[a]}else{let A=l(t),u=l(t);for(let d=0;d<A;d++)l(t),t.readBits(1);for(let d=0;d<u;d++)l(t),t.readBits(1);o=A+u}return o},vt=(t,e)=>{let r=2,i=2,o=2,s=0,a=0,A={num:1,den:1};if(t.readBits(1)){let u=t.readBits(8);if(u===255)A={num:t.readBits(16),den:t.readBits(16)};else{let d=Je[u];d&&(A=d)}}return t.readBits(1)&&t.readBits(1),t.readBits(1)&&(t.readBits(3),s=t.readBits(1),t.readBits(1)&&(r=t.readBits(8),i=t.readBits(8),o=t.readBits(8))),t.readBits(1)&&(l(t),l(t)),t.readBits(1),t.readBits(1),t.readBits(1),t.readBits(1)&&(l(t),l(t),l(t),l(t)),t.readBits(1)&&(t.readBits(32),t.readBits(32),t.readBits(1)&&l(t),t.readBits(1)&&yt(t,!0,e)),t.readBits(1)&&(t.readBits(1),t.readBits(1),t.readBits(1),a=l(t),l(t),l(t),l(t),l(t)),{pixelAspectRatio:A,colourPrimaries:r,transferCharacteristics:i,matrixCoefficients:o,fullRangeFlag:s,minSpatialSegmentationIdc:a}},yt=(t,e,r)=>{let i=!1,o=!1,s=!1;e&&(i=t.readBits(1)===1,o=t.readBits(1)===1,(i||o)&&(s=t.readBits(1)===1,s&&(t.readBits(8),t.readBits(5),t.readBits(1),t.readBits(5)),t.readBits(4),t.readBits(4),s&&t.readBits(4),t.readBits(5),t.readBits(5),t.readBits(5)));for(let a=0;a<=r;a++){let A=t.readBits(1)===1,u=!0;A||(u=t.readBits(1)===1);let d=!1;u?l(t):d=t.readBits(1)===1;let c=1;d||(c=l(t)+1),i&&Ye(t,c,s),o&&Ye(t,c,s)}},Ye=(t,e,r)=>{for(let i=0;i<e;i++)l(t),l(t),r&&(l(t),l(t)),t.readBits(1)},je=t=>{let e=[];e.push(t.configurationVersion),e.push((t.generalProfileSpace&3)<<6|(t.generalTierFlag&1)<<5|t.generalProfileIdc&31),e.push(t.generalProfileCompatibilityFlags>>>24&255),e.push(t.generalProfileCompatibilityFlags>>>16&255),e.push(t.generalProfileCompatibilityFlags>>>8&255),e.push(t.generalProfileCompatibilityFlags&255),e.push(...t.generalConstraintIndicatorFlags),e.push(t.generalLevelIdc&255),e.push(240|t.minSpatialSegmentationIdc>>8&15),e.push(t.minSpatialSegmentationIdc&255),e.push(252|t.parallelismType&3),e.push(252|t.chromaFormatIdc&3),e.push(248|t.bitDepthLumaMinus8&7),e.push(248|t.bitDepthChromaMinus8&7),e.push(t.avgFrameRate>>8&255),e.push(t.avgFrameRate&255),e.push((t.constantFrameRate&3)<<6|(t.numTemporalLayers&7)<<3|(t.temporalIdNested&1)<<2|t.lengthSizeMinusOne&3),e.push(t.arrays.length&255);for(let r of t.arrays){e.push((r.arrayCompleteness&1)<<7|0|r.nalUnitType&63),e.push(r.nalUnits.length>>8&255),e.push(r.nalUnits.length&255);for(let i of r.nalUnits){e.push(i.length>>8&255),e.push(i.length&255);for(let o=0;o<i.length;o++)e.push(i[o])}}return new Uint8Array(e)};var Ze=t=>{let e=new O(t);if(e.readBits(2)!==2)return null;let i=e.readBits(1),s=(e.readBits(1)<<1)+i;if(s===3&&e.skipBits(1),e.readBits(1)===1||e.readBits(1)!==0||(e.skipBits(2),e.readBits(24)!==4817730))return null;let d=8;s>=2&&(d=e.readBits(1)?12:10);let c=e.readBits(3),h=0,I=0;if(c!==7)if(I=e.readBits(1),s===1||s===3){let N=e.readBits(1),F=e.readBits(1);h=!N&&!F?3:N&&!F?2:1,e.skipBits(1)}else h=1;else h=3,I=1;let _=e.readBits(16),g=e.readBits(16),x=_+1,b=g+1,T=x*b,y=$(Q).level;for(let w of Q)if(T<=w.maxPictureSize){y=w.level;break}return{profile:s,level:y,bitDepth:d,chromaSubsampling:h,videoFullRangeFlag:I,colourPrimaries:c===2?1:c===1?6:2,transferCharacteristics:c===2?1:c===1?6:2,matrixCoefficients:c===7?0:c===2?1:c===1?6:2}},St=function*(t){let e=new O(t),r=()=>{let i=0;for(let o=0;o<8;o++){let s=e.readAlignedByte();if(i|=(s&127)<<o*7,!(s&128))break;if(o===7&&s&128)return null}return i>=2**32-1?null:i};for(;e.getBitsLeft()>=8;){e.skipBits(1);let i=e.readBits(4),o=e.readBits(1),s=e.readBits(1);e.skipBits(1),o&&e.skipBits(8);let a;if(s){let A=r();if(A===null)return;a=A}else a=Math.floor(e.getBitsLeft()/8);p(e.pos%8===0),yield{type:i,data:t.subarray(e.pos/8,e.pos/8+a)},e.skipBits(a*8)}},et=t=>{for(let{type:e,data:r}of St(t)){if(e!==1)continue;let i=new O(r),o=i.readBits(3),s=i.readBits(1),a=i.readBits(1),A=0,u=0,d=0;if(a)A=i.readBits(5);else{if(i.readBits(1)&&(i.skipBits(32),i.skipBits(32),i.readBits(1)))return null;let w=i.readBits(1);w&&(d=i.readBits(5),i.skipBits(32),i.skipBits(5),i.skipBits(5));let N=i.readBits(5);for(let F=0;F<=N;F++){i.skipBits(12);let k=i.readBits(5);if(F===0&&(A=k),k>7){let U=i.readBits(1);F===0&&(u=U)}if(w&&i.readBits(1)){let S=d+1;i.skipBits(S),i.skipBits(S),i.skipBits(1)}i.readBits(1)&&i.skipBits(4)}}let c=i.readBits(4),h=i.readBits(4),I=c+1;i.skipBits(I);let _=h+1;i.skipBits(_);let g=0;if(a?g=0:g=i.readBits(1),g&&(i.skipBits(4),i.skipBits(3)),i.skipBits(1),i.skipBits(1),i.skipBits(1),!a){i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let E=i.readBits(1);E&&(i.skipBits(1),i.skipBits(1));let w=i.readBits(1),N=0;w?N=2:N=i.readBits(1),N>0&&(i.readBits(1)||i.skipBits(1)),E&&i.skipBits(3)}i.skipBits(1),i.skipBits(1),i.skipBits(1);let x=i.readBits(1),b=8;o===2&&x?b=i.readBits(1)?12:10:o<=2&&(b=x?10:8);let T=0;o!==1&&(T=i.readBits(1));let y=1,P=1,V=0;return T||(o===0?(y=1,P=1):o===1?(y=0,P=0):b===12&&(y=i.readBits(1),y&&(P=i.readBits(1))),y&&P&&(V=i.readBits(2))),{profile:o,level:A,tier:u,bitDepth:b,monochrome:T,chromaSubsamplingX:y,chromaSubsamplingY:P,chromaSamplePosition:V}}return null};var Er=[64*2,69*2,96*2,64*2,70*2,96*2,80*2,87*2,120*2,80*2,88*2,120*2,96*2,104*2,144*2,96*2,105*2,144*2,112*2,121*2,168*2,112*2,122*2,168*2,128*2,139*2,192*2,128*2,140*2,192*2,160*2,174*2,240*2,160*2,175*2,240*2,192*2,208*2,288*2,192*2,209*2,288*2,224*2,243*2,336*2,224*2,244*2,336*2,256*2,278*2,384*2,256*2,279*2,384*2,320*2,348*2,480*2,320*2,349*2,480*2,384*2,417*2,576*2,384*2,418*2,576*2,448*2,487*2,672*2,448*2,488*2,672*2,512*2,557*2,768*2,512*2,558*2,768*2,640*2,696*2,960*2,640*2,697*2,960*2,768*2,835*2,1152*2,768*2,836*2,1152*2,896*2,975*2,1344*2,896*2,976*2,1344*2,1024*2,1114*2,1536*2,1024*2,1115*2,1536*2,1152*2,1253*2,1728*2,1152*2,1254*2,1728*2,1280*2,1393*2,1920*2,1280*2,1394*2,1920*2];var Br=new Uint8Array([5,4,65,67,45,51]),wr=new Uint8Array([5,4,69,65,67,51]);var de=class extends It{constructor(){super(...arguments);this.codecContext=null;this.scaler=null;this.dstFrame=null;this.lastBuffer=null;this.packetEmitted=!1;this.lastScalerKey=null;this.preciseTimings=[]}static supports(r,i){return(r==="avc"||r==="hevc"||r==="vp8"||r==="vp9"||r==="av1")&&i.bitrateMode!=="quantizer"}async init(){this.frame=new m.Frame,this.frame.alloc(),this.frame.timeBase=new m.Rational(1,1e6),this.packet=new m.Packet,this.packet.alloc();let r=W[this.codec];p(r!==void 0);let i=null;if(this.codec==="vp9"&&this.config.alpha==="keep"?i=m.Codec.findEncoderByName(m.FF_ENCODER_LIBVPX_VP9)??m.Codec.findEncoder(r):this.config.hardwareAcceleration==="prefer-software"?i=m.Codec.findEncoder(r):i=Te(r)??m.Codec.findEncoder(r),!i)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=i,await this.createCodecContext()}async createCodecContext(){p(this.codecContext===null);let r=new m.CodecContext;r.allocContext3(this.avCodec);let i=m.AV_PIX_FMT_YUV420P;this.avCodec.pixelFormats&&(this.avCodec.pixelFormats.includes(m.AV_PIX_FMT_YUV420P)||(i=this.avCodec.pixelFormats[0]),this.config.alpha==="keep"&&this.avCodec.pixelFormats.includes(m.AV_PIX_FMT_YUVA420P)&&(i=m.AV_PIX_FMT_YUVA420P));let o=se({num:(this.config.displayWidth??this.config.width)*this.config.height,den:(this.config.displayHeight??this.config.height)*this.config.width});r.width=this.config.width,r.height=this.config.height,r.pixelFormat=i,r.timeBase=new m.Rational(1,1e6),r.gopSize=60,r.framerate=new m.Rational(Math.round(this.config.framerate??0)||30,1),r.bitRate=BigInt(this.config.bitrate??_t._toVideoBitrate(this.codec,this.config.width,this.config.height)),r.sampleAspectRatio=new m.Rational(o.num,o.den),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let s=this.config.latencyMode==="realtime";this.avCodec.name==="libx264"?s&&(r.setOption("tune","zerolatency"),r.setOption("preset","ultrafast")):this.avCodec.name==="libx265"?(r.setOption("x265-params","log-level=error"),s&&(r.setOption("tune","zerolatency"),r.setOption("preset","ultrafast"))):this.avCodec.name==="libvpx"?(s&&r.setOption("deadline","realtime"),r.setOption("cpu-used","8")):this.avCodec.name==="libvpx-vp9"?(r.setOption("deadline","realtime"),s?r.setOption("cpu-used","8"):r.setOption("cpu-used","5")):this.avCodec.name==="libsvtav1"&&(process.env.SVT_LOG="1",s&&r.setOption("preset","12"));let a=await r.open2();m.FFmpegError.throwIfError(a,"Open codec context"),this.codecContext=r}async encode(r,i){if(this.codecContext===null&&await this.createCodecContext(),p(this.codecContext),r._data instanceof z)this.frame.unref(),this.frame.ref(r._data.frame);else{if(r.format===null)throw new Error("Cannot encode foreign VideoSample with unknown (null) format.");this.lastBuffer=await ee(r,this.frame,this.lastBuffer)}let o=this.frame;if(this.codecContext.pixelFormat!==this.frame.format||this.codecContext.width!==this.frame.width||this.codecContext.height!==this.frame.height){this.scaler||(this.scaler=new m.SoftwareScaleContext);let d=`${this.frame.width}x${this.frame.height}:${this.frame.format}`;if(d!==this.lastScalerKey){this.scaler.getContext(this.frame.width,this.frame.height,this.frame.format,this.codecContext.width,this.codecContext.height,this.codecContext.pixelFormat,m.SWS_FAST_BILINEAR),this.lastScalerKey=d;let h=this.scaler.initContext();m.FFmpegError.throwIfError(h,"initContext")}this.dstFrame||(this.dstFrame=new m.Frame,this.dstFrame.alloc(),this.dstFrame.width=this.codecContext.width,this.dstFrame.height=this.codecContext.height,this.dstFrame.format=this.codecContext.pixelFormat,this.dstFrame.allocBuffer()),await this.scaler.scaleFrame(this.dstFrame,this.frame),this.dstFrame.copyProps(this.frame),o=this.dstFrame}o.pts=BigInt(r.microsecondTimestamp),o.duration=BigInt(r.microsecondDuration),o.timeBase=new m.Rational(1,1e6),o.pictType=i?.keyFrame?m.AV_PICTURE_TYPE_I:m.AV_PICTURE_TYPE_NONE,o.keyFrame=i?.keyFrame?1:0;let a=j(this.preciseTimings,r.microsecondTimestamp,d=>d.microsecondTimestamp),A=a!==-1?this.preciseTimings[a]:null;A&&A.microsecondTimestamp===r.microsecondTimestamp?(A.timestamp!==r.timestamp&&(A.timestampIsValid=!1),A.duration!==r.duration&&(A.durationIsValid=!1)):(this.preciseTimings.splice(a+1,0,{microsecondTimestamp:r.microsecondTimestamp,timestamp:r.timestamp,duration:r.duration,timestampIsValid:!0,durationIsValid:!0}),this.preciseTimings.length>128&&this.preciseTimings.shift());let u=await this.codecContext.sendFrame(o);for(m.FFmpegError.throwIfError(u,"Send frame");;){let d=await this.codecContext.receivePacket(this.packet);if(d===m.AVERROR_EAGAIN||d===m.AVERROR_EOF)break;this.receivePacket(d)}}receivePacket(r){if(p(this.codecContext),m.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let i=M(this.packet.data),o=Number(this.packet.pts)/1e6,s=Number(this.packet.duration)/1e6,a=j(this.preciseTimings,Number(this.packet.pts),g=>g.microsecondTimestamp),A=a!==-1?this.preciseTimings[a]:null;A&&A.microsecondTimestamp===Number(this.packet.pts)&&(A.timestampIsValid&&(o=A.timestamp),A.durationIsValid&&(s=A.duration));let u={},d=null,c=null;if(this.codec==="avc"||this.codec==="hevc"){let g=!1;if(this.codec==="avc"?g=this.config.avc?.format==="annexb":g=this.config.hevc?.format==="annexb",!this.packetEmitted){let x;if(this.codec==="avc"){let b=Ke(this.packet.data);if(!b)throw new Error("Invalid AVC data, could not extract decoder configuration record.");x=Qe(b)}else{let b=$e(this.packet.data);if(!b)throw new Error("Invalid HEVC data, could not extract decoder configuration record.");x=je(b)}d=te({width:this.config.width,height:this.config.height,codec:this.codec,codecDescription:x,colorSpace:null,avcType:1,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}),g||(c=x)}if(!g){let b=[];for(let E of le(i))if(this.codec==="avc"){let w=Se(i[E.offset]);w!==7&&w!==8&&w!==13&&b.push(E)}else{let w=ce(i[E.offset]);w!==33&&w!==34&&w!==32&&b.push(E)}let T=0;for(let E of b)T+=4+E.length;let y=new Uint8Array(T),P=new DataView(y.buffer),V=0;for(let E of b){let w=E.length;P.setUint32(V,w,!1),V+=4,y.set(i.subarray(E.offset,E.offset+E.length),V),V+=E.length}i=y}}else if(this.codec==="vp8")this.packetEmitted||(d=te({width:this.config.width,height:this.config.height,codec:"vp8",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}));else if(this.codec==="vp9"){if(!this.packetEmitted){let g=Ze(i);d=te({width:this.config.width,height:this.config.height,codec:"vp9",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:g,av1CodecInfo:null})}}else if(this.codec==="av1"){if(!this.packetEmitted){let g=et(i);d=te({width:this.config.width,height:this.config.height,codec:"av1",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:g})}}else throw new Error("Unreachable.");let h={},I=this.packet.getSideData(m.AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL);I&&(h.alpha=M(I).subarray(8));let _=new Et(i,this.packet.isKeyframe?"key":"delta",o,s,void 0,void 0,h);d!==null&&(u.decoderConfig={codec:d,codedWidth:this.codecContext.width,codedHeight:this.codecContext.height,displayAspectWidth:this.config.displayWidth??this.codecContext.width,displayAspectHeight:this.config.displayHeight??this.codecContext.height,description:c??void 0,colorSpace:{primaries:ie(this.codecContext.colorPrimaries),matrix:oe(this.codecContext.colorSpace),transfer:ne(this.codecContext.colorTrc),fullRange:this.codecContext.colorRange===m.AVCOL_RANGE_JPEG?!0:this.codecContext.colorRange===m.AVCOL_RANGE_MPEG?!1:void 0}}),this.packetEmitted=!0,this.onPacket(_,u)}async flush(){if(this.codecContext){let r=await this.codecContext.sendFrame(null);for(m.FFmpegError.throwIfError(r,"Send frame");;){let i=await this.codecContext.receivePacket(this.packet);if(i===m.AVERROR_EAGAIN||i===m.AVERROR_EOF)break;this.receivePacket(i)}this.codecContext.freeContext(),this.codecContext=null}this.packetEmitted=!1}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free(),this.scaler?.freeContext(),this.dstFrame?.free()}};import{AudioSample as wt,CustomAudioDecoder as Tt}from"mediabunny";import*as B from"node-av";import{AudioSampleResource as Bt}from"mediabunny";import*as Ae from"node-av";var G=class extends Bt{get frame(){if(!this._frame)throw new Error("AvFrameAudioSampleResource has been closed.");return this._frame}constructor(e){if(super(),e.getMediaType()!==Ae.AVMEDIA_TYPE_AUDIO)throw new Error("AvFrameAudioSampleResource must be initialized with an audio frame.");this._frame=e}getFormat(){let e=Ne(this.frame.format);if(e===null){let r=Ae.avGetSampleFmtName(this.frame.format);throw new TypeError(`Unsupported audio sample format: ${r} (${this.frame.format})`)}return e}getSampleRate(){return this.frame.sampleRate}getNumberOfChannels(){return this.frame.channels}getNumberOfFrames(){return this.frame.nbSamples}getTimestamp(){return Number(this.frame.pts)/this.frame.timeBase.den}close(){this.frame.free(),this._frame=null}getDataPlane(e){return p(this.frame.data&&e<this.frame.data.length),M(this.frame.data[e])}},ue=(t,e)=>{e.format=Me(t.format),e.nbSamples=t.numberOfFrames,e.sampleRate=t.sampleRate,e.channelLayout=Y(t.numberOfChannels),e.allocBuffer(),p(e.data);for(let r=0;r<e.data.length;r++)t.copyTo(e.data[r],{planeIndex:r})};var me=class extends Tt{constructor(){super(...arguments);this.codecContext=null}static supports(r,i){return r==="aac"||r==="opus"||r==="mp3"||r==="vorbis"||r==="flac"||r==="ac3"||r==="eac3"}async init(){this.frame=new B.Frame,this.frame.alloc(),this.packet=new B.Packet,this.packet.alloc();let r=W[this.codec];p(r!==void 0);let i=B.Codec.findDecoder(r);if(i===null)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let o=new B.CodecContext;o.allocContext3(i),o.sampleRate=this.config.sampleRate,o.channelLayout=Y(this.config.numberOfChannels),o.timeBase=new B.Rational(1,this.config.sampleRate),o.codecType=B.AVMEDIA_TYPE_AUDIO,o.codecId=r,o.extraData=this.config.description?Buffer.from(M(this.config.description)):null;let s=await o.open2();B.FFmpegError.throwIfError(s,"Open codec context"),this.codecContext=o}async decode(r){p(this.codecContext),this.packet.isKeyframe=r.type==="key",this.packet.data=Buffer.from(r.data),this.packet.timeBase={num:1,den:this.config.sampleRate},this.packet.pts=BigInt(Math.round(r.timestamp*this.config.sampleRate)),this.packet.dts=B.AV_NOPTS_VALUE,this.packet.duration=BigInt(Math.round(r.duration*this.config.sampleRate));let i=await this.codecContext.sendPacket(this.packet);for(B.FFmpegError.throwIfError(i,"Send packet"),this.packet.unref();;){let o=await this.codecContext.receiveFrame(this.frame);if(o===B.AVERROR_EAGAIN||o===B.AVERROR_EOF)break;this.receiveFrame(o)}}receiveFrame(r){B.FFmpegError.throwIfError(r,"Receive frame");let i=this.frame.clone();if(!i)throw new Error("Allocation failure during frame clone.");i.timeBase=new B.Rational(1,this.config.sampleRate),this.onSample(new wt(new G(i)))}async flush(){p(this.codecContext);let r=await this.codecContext.sendPacket(null);for(B.FFmpegError.throwIfError(r,"Flush decoder");;){let i=await this.codecContext.receiveFrame(this.frame);if(i===B.AVERROR_EAGAIN||i===B.AVERROR_EOF)break;this.receiveFrame(i)}this.codecContext.flushBuffers()}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free()}};import{CustomAudioEncoder as Pt,QUALITY_MEDIUM as Ft,EncodedPacket as Rt}from"mediabunny";import*as v from"node-av";var Vt=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],Nt=[8e3,12e3,16e3,24e3,48e3],Mt=[8e3,11025,12e3,16e3,22050,24e3,32e3,44100,48e3],tt=[32e3,44100,48e3],_e=1024,fe=class extends Pt{constructor(){super(...arguments);this.codecContext=null;this.resampler=null;this.dstFrame=null;this.firstExpectedTimestamp=null;this.outputTimestampOffset=0;this.inputParametersKey=null;this.resamplerInputSampleRate=null;this.nextResamplerPts=null;this.packetEmitted=!1;this.adtsHeaderTemplate=null}static supports(r,i){let{numberOfChannels:o,sampleRate:s}=i;return r==="aac"&&o>=1&&o<=48&&Vt.includes(s)||r==="opus"&&o>=1&&o<=255&&Nt.includes(s)||r==="mp3"&&o>=1&&o<=2&&Mt.includes(s)||r==="vorbis"&&o>=1&&o<=255&&s<=2e5||r==="flac"&&o>=1&&o<=8&&s<=655350||r==="ac3"&&o>=1&&o<=6&&tt.includes(s)||r==="eac3"&&o>=1&&o<=16&&tt.includes(s)}async init(){this.frame=new v.Frame,this.frame.alloc(),this.packet=new v.Packet,this.packet.alloc();let r=W[this.codec];p(r!==void 0);let i=v.Codec.findEncoder(r);if(!i)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=i,await this.createCodecContext()}async createCodecContext(){p(this.codecContext===null);let r=new v.CodecContext;r.allocContext3(this.avCodec);let i=v.AV_SAMPLE_FMT_FLTP;this.avCodec.sampleFormats&&!this.avCodec.sampleFormats.includes(v.AV_SAMPLE_FMT_FLTP)&&(i=this.avCodec.sampleFormats[0]),r.sampleRate=this.config.sampleRate,r.channelLayout=Y(this.config.numberOfChannels),r.codecType=v.AVMEDIA_TYPE_AUDIO,r.codecId=W[this.codec],r.sampleFormat=i,r.timeBase=new v.Rational(1,this.config.sampleRate),r.bitRate=BigInt(this.config.bitrate??Ft._toAudioBitrate(this.codec)??0),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let o=await r.open2();v.FFmpegError.throwIfError(o,"Open codec context"),this.codecContext=r}async encode(r){this.codecContext===null&&(await this.createCodecContext(),p(this.codecContext)),this.firstExpectedTimestamp??=r.timestamp,r._data instanceof G?(this.frame.unref(),this.frame.ref(r._data.frame)):ue(r,this.frame),this.frame.pts=BigInt(Math.round(r.timestamp*this.config.sampleRate)),this.frame.duration=BigInt(Math.round(r.duration*this.config.sampleRate)),this.frame.timeBase=new v.Rational(1,this.config.sampleRate);let i=`${this.frame.sampleRate}:${this.frame.channels}:${this.frame.format}`;if(this.inputParametersKey!==null&&this.inputParametersKey!==i)throw new Error("Input audio parameters changed. For this audio encoder, you cannot change the input audio parameters over time.");if(this.inputParametersKey=i,this.codecContext.frameSize>0||this.codecContext.sampleFormat!==this.frame.format||this.codecContext.sampleRate!==this.frame.sampleRate||this.codecContext.channels!==this.frame.channels){if(!this.resampler){this.resampler=new v.SoftwareResampleContext,this.resamplerInputSampleRate=this.frame.sampleRate;let a=Y(this.codecContext.channels),A=Y(this.frame.channels),u=this.resampler.allocSetOpts2(a,this.codecContext.sampleFormat,this.codecContext.sampleRate,A,this.frame.format,this.frame.sampleRate);v.FFmpegError.throwIfError(u,"allocSetOpts2");let d=this.resampler.init();v.FFmpegError.throwIfError(d,"init"),this.dstFrame=new v.Frame,this.dstFrame.alloc(),this.dstFrame.channelLayout=a,this.dstFrame.sampleRate=this.codecContext.sampleRate,this.dstFrame.format=this.codecContext.sampleFormat,this.dstFrame.nbSamples=this.codecContext.frameSize||_e,this.dstFrame.duration=BigInt(this.dstFrame.nbSamples),this.dstFrame.allocBuffer(),this.nextResamplerPts=this.frame.pts}let s=this.frame.data;if(!s)throw new DOMException("Frame has no data","EncodingError");await this.resampler.convert(null,0,s,this.frame.nbSamples),await this.pullResampledFrames()}else await this.sendFrameAndReceivePackets(this.frame)}async pullResampledFrames(){p(this.codecContext),p(this.resampler),p(this.dstFrame),p(this.nextResamplerPts!==null);let r=this.codecContext.frameSize||_e;for(;!(this.resampler.getOutSamples(0)<r);)await this.resampler.convert(this.dstFrame.data,r,null,0),this.dstFrame.pts=this.nextResamplerPts,await this.sendFrameAndReceivePackets(this.dstFrame),this.nextResamplerPts+=BigInt(r)}async sendFrameAndReceivePackets(r){p(this.codecContext);let i=await this.codecContext.sendFrame(r);for(v.FFmpegError.throwIfError(i,"Send frame");;){let o=await this.codecContext.receivePacket(this.packet);if(o===v.AVERROR_EAGAIN||o===v.AVERROR_EOF)break;this.receivePacket(o)}}receivePacket(r){if(p(this.codecContext),p(this.firstExpectedTimestamp!==null),v.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let i=Number(this.packet.pts)/this.codecContext.sampleRate,o=Number(this.packet.duration)/this.codecContext.sampleRate,s=this.packet.data,a;if(this.packetEmitted)a={};else{this.outputTimestampOffset=Math.max(this.firstExpectedTimestamp-i,0);let u=this.config.codec,d=this.codecContext.extraData?M(this.codecContext.extraData):void 0;if(this.codec==="aac"){if(!d)throw new Error("Extradata expected for AAC.");if(this.config.aac?.format==="adts"){let h=He(d);this.adtsHeaderTemplate=qe(h),d=void 0}}else if(this.codec==="opus"){if(!d)throw new Error("Extradata expected for Opus.")}else if(this.codec==="vorbis"){if(!d)throw new Error("Extradata expected for Vorbis.")}else if(this.codec==="flac"){if(!d)throw new Error("Extradata expected for FLAC.");d=new Uint8Array([102,76,97,67,128,0,0,d.byteLength,...d])}a={decoderConfig:{codec:u,sampleRate:this.codecContext.sampleRate,numberOfChannels:this.codecContext.channels,description:d}}}if(this.adtsHeaderTemplate){let u=s.byteLength+this.adtsHeaderTemplate.header.byteLength;this.adtsHeaderTemplate.bitstream.pos=30,this.adtsHeaderTemplate.bitstream.writeBits(13,u);let d=new Uint8Array(this.adtsHeaderTemplate.header.byteLength+s.byteLength);d.set(this.adtsHeaderTemplate.header,0),d.set(s,this.adtsHeaderTemplate.header.byteLength),s=d}i+=this.outputTimestampOffset;let A=new Rt(s,"key",i,o);this.packetEmitted=!0,this.onPacket(A,a)}async flush(){if(this.codecContext){e:if(this.resampler){p(this.resamplerInputSampleRate!==null);let r=this.resampler.getOutSamples(0);if(r===0)break e;let i=this.codecContext.frameSize||_e;p(r<i);let o=Math.ceil((i-r)/this.codecContext.sampleRate*this.resamplerInputSampleRate);this.resampler.injectSilence(o),await this.pullResampledFrames()}await this.sendFrameAndReceivePackets(null),this.codecContext.freeContext(),this.codecContext=null,this.packetEmitted=!1,this.firstExpectedTimestamp=null,this.outputTimestampOffset=0,this.adtsHeaderTemplate=null,this.resampler?.free(),this.resampler=null,this.inputParametersKey=null,this.resamplerInputSampleRate=null,this.nextResamplerPts=null,this.dstFrame?.free(),this.dstFrame=null}}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free(),this.dstFrame?.free(),this.resampler?.free()}};var ot=Symbol.for("@mediabunny/server loaded");globalThis[ot]&&console.error(`[WARNING]
|
|
9
|
-
@mediabunny/server was loaded twice. This will likely cause the package not to work correctly. Check if multiple dependencies are importing different versions of @mediabunny/server, or if something is being bundled incorrectly.`);globalThis[
|
|
8
|
+
import{AudioSample as Dt,registerDecoder as nt,registerEncoder as ot,registerVideoSampleTransformer as Ot,VideoSample as st}from"mediabunny";import*as z from"node-av";import{CustomVideoDecoder as ut,VideoSample as mt}from"mediabunny";import*as b from"node-av";import*as n from"node-av";var X={avc:n.AV_CODEC_ID_H264,hevc:n.AV_CODEC_ID_HEVC,vp8:n.AV_CODEC_ID_VP8,vp9:n.AV_CODEC_ID_VP9,av1:n.AV_CODEC_ID_AV1,aac:n.AV_CODEC_ID_AAC,opus:n.AV_CODEC_ID_OPUS,mp3:n.AV_CODEC_ID_MP3,vorbis:n.AV_CODEC_ID_VORBIS,flac:n.AV_CODEC_ID_FLAC,ac3:n.AV_CODEC_ID_AC3,eac3:n.AV_CODEC_ID_EAC3},he,Be=()=>G.hardwareContext!==void 0&&typeof G.hardwareContext!="function"?G.hardwareContext:(he===void 0&&(he=n.HardwareContext.auto()),he),Te=t=>{if(t!==null&&!(t instanceof n.HardwareContext))throw new TypeError("When serverOptions.hardwareContext is a function, it must return or resolve to a NodeAv.HardwareContext or null.")},ge=new Map,Pe=async t=>{if(typeof G.hardwareContext=="function"){let e=await G.hardwareContext(t);return Te(e),e?.getDecoderCodec(t)??null}if(!ge.has(t)){let e=Be();ge.set(t,e?.getDecoderCodec(t)??null)}return ge.get(t)},Ce=new Map,Fe=async t=>{if(typeof G.hardwareContext=="function"){let e=await G.hardwareContext(t);return Te(e),e?.getEncoderCodec(t)??null}if(!Ce.has(t)){let e=Be();Ce.set(t,e?.getEncoderCodec(t)??null)}return Ce.get(t)},Re=t=>{switch(t){case"bt709":return n.AVCOL_PRI_BT709;case"bt470bg":return n.AVCOL_PRI_BT470BG;case"smpte170m":return n.AVCOL_PRI_SMPTE170M;case"bt2020":return n.AVCOL_PRI_BT2020;case"smpte432":return n.AVCOL_PRI_SMPTE432}return null},oe=t=>{switch(t){case n.AVCOL_PRI_BT709:return"bt709";case n.AVCOL_PRI_BT470BG:return"bt470bg";case n.AVCOL_PRI_SMPTE170M:return"smpte170m";case n.AVCOL_PRI_BT2020:return"bt2020";case n.AVCOL_PRI_SMPTE432:return"smpte432"}return null},Ve=t=>{switch(t){case"bt709":return n.AVCOL_TRC_BT709;case"smpte170m":return n.AVCOL_TRC_SMPTE170M;case"iec61966-2-1":return n.AVCOL_TRC_IEC61966_2_1;case"linear":return n.AVCOL_TRC_LINEAR;case"pq":return n.AVCOL_TRC_SMPTE2084;case"hlg":return n.AVCOL_TRC_ARIB_STD_B67}return null},se=t=>{switch(t){case n.AVCOL_TRC_BT709:return"bt709";case n.AVCOL_TRC_SMPTE170M:return"smpte170m";case n.AVCOL_TRC_IEC61966_2_1:return"iec61966-2-1";case n.AVCOL_TRC_LINEAR:return"linear";case n.AVCOL_TRC_SMPTE2084:return"pq";case n.AVCOL_TRC_ARIB_STD_B67:return"hlg"}return null},Ne=t=>{switch(t){case"rgb":return n.AVCOL_SPC_RGB;case"bt709":return n.AVCOL_SPC_BT709;case"bt470bg":return n.AVCOL_SPC_BT470BG;case"smpte170m":return n.AVCOL_SPC_SMPTE170M;case"bt2020-ncl":return n.AVCOL_SPC_BT2020_NCL}return null},ae=t=>{switch(t){case n.AVCOL_SPC_RGB:return"rgb";case n.AVCOL_SPC_BT709:return"bt709";case n.AVCOL_SPC_BT470BG:return"bt470bg";case n.AVCOL_SPC_SMPTE170M:return"smpte170m";case n.AVCOL_SPC_BT2020_NCL:return"bt2020-ncl"}return null},Me=t=>{switch(t){case n.AV_PIX_FMT_YUV420P:return"I420";case n.AV_PIX_FMT_YUVJ420P:return"I420";case n.AV_PIX_FMT_YUV420P10LE:return"I420P10";case n.AV_PIX_FMT_YUV420P12LE:return"I420P12";case n.AV_PIX_FMT_YUVA420P:return"I420A";case n.AV_PIX_FMT_YUVA420P10LE:return"I420AP10";case n.AV_PIX_FMT_YUV422P:return"I422";case n.AV_PIX_FMT_YUVJ422P:return"I422";case n.AV_PIX_FMT_YUV422P10LE:return"I422P10";case n.AV_PIX_FMT_YUV422P12LE:return"I422P12";case n.AV_PIX_FMT_YUVA422P:return"I422A";case n.AV_PIX_FMT_YUVA422P10LE:return"I422AP10";case n.AV_PIX_FMT_YUVA422P12LE:return"I422AP12";case n.AV_PIX_FMT_YUV444P:return"I444";case n.AV_PIX_FMT_YUVJ444P:return"I444";case n.AV_PIX_FMT_YUV444P10LE:return"I444P10";case n.AV_PIX_FMT_YUV444P12LE:return"I444P12";case n.AV_PIX_FMT_YUVA444P:return"I444A";case n.AV_PIX_FMT_YUVA444P10LE:return"I444AP10";case n.AV_PIX_FMT_YUVA444P12LE:return"I444AP12";case n.AV_PIX_FMT_NV12:return"NV12";case n.AV_PIX_FMT_RGBA:return"RGBA";case n.AV_PIX_FMT_RGB0:return"RGBX";case n.AV_PIX_FMT_BGRA:return"BGRA";case n.AV_PIX_FMT_BGR0:return"BGRX";default:return null}},be=t=>{switch(t){case"I420":return n.AV_PIX_FMT_YUV420P;case"I420P10":return n.AV_PIX_FMT_YUV420P10LE;case"I420P12":return n.AV_PIX_FMT_YUV420P12LE;case"I420A":return n.AV_PIX_FMT_YUVA420P;case"I420AP10":return n.AV_PIX_FMT_YUVA420P10LE;case"I422":return n.AV_PIX_FMT_YUV422P;case"I422P10":return n.AV_PIX_FMT_YUV422P10LE;case"I422P12":return n.AV_PIX_FMT_YUV422P12LE;case"I422A":return n.AV_PIX_FMT_YUVA422P;case"I422AP10":return n.AV_PIX_FMT_YUVA422P10LE;case"I422AP12":return n.AV_PIX_FMT_YUVA422P12LE;case"I444":return n.AV_PIX_FMT_YUV444P;case"I444P10":return n.AV_PIX_FMT_YUV444P10LE;case"I444P12":return n.AV_PIX_FMT_YUV444P12LE;case"I444A":return n.AV_PIX_FMT_YUVA444P;case"I444AP10":return n.AV_PIX_FMT_YUVA444P10LE;case"I444AP12":return n.AV_PIX_FMT_YUVA444P12LE;case"NV12":return n.AV_PIX_FMT_NV12;case"RGBA":return n.AV_PIX_FMT_RGBA;case"RGBX":return n.AV_PIX_FMT_RGB0;case"BGRA":return n.AV_PIX_FMT_BGRA;case"BGRX":return n.AV_PIX_FMT_BGR0;default:return n.AV_PIX_FMT_NONE}},ke=t=>{switch(t){case n.AV_SAMPLE_FMT_U8:return"u8";case n.AV_SAMPLE_FMT_S16:return"s16";case n.AV_SAMPLE_FMT_S32:return"s32";case n.AV_SAMPLE_FMT_FLT:return"f32";case n.AV_SAMPLE_FMT_U8P:return"u8-planar";case n.AV_SAMPLE_FMT_S16P:return"s16-planar";case n.AV_SAMPLE_FMT_S32P:return"s32-planar";case n.AV_SAMPLE_FMT_FLTP:return"f32-planar";default:return null}},Ue=t=>{switch(t){case"u8":return n.AV_SAMPLE_FMT_U8;case"s16":return n.AV_SAMPLE_FMT_S16;case"s32":return n.AV_SAMPLE_FMT_S32;case"f32":return n.AV_SAMPLE_FMT_FLT;case"u8-planar":return n.AV_SAMPLE_FMT_U8P;case"s16-planar":return n.AV_SAMPLE_FMT_S16P;case"s32-planar":return n.AV_SAMPLE_FMT_S32P;case"f32-planar":return n.AV_SAMPLE_FMT_FLTP;default:return n.AV_SAMPLE_FMT_NONE}},Q=t=>{switch(t){case 1:return n.AV_CHANNEL_LAYOUT_MONO;case 2:return n.AV_CHANNEL_LAYOUT_STEREO;case 4:return n.AV_CHANNEL_LAYOUT_QUAD;case 6:return n.AV_CHANNEL_LAYOUT_5POINT1_BACK;case 8:return n.AV_CHANNEL_LAYOUT_7POINT1;default:return{nbChannels:t,order:n.AV_CHANNEL_ORDER_UNSPEC,mask:0n}}};function p(t){if(!t)throw new Error("Assertion failed.")}var $=t=>t&&t[t.length-1];var l=t=>{let e=0;for(;t.readBits(1)===0&&e<32;)e++;if(e>=32)throw new Error("Invalid exponential-Golomb code.");return(1<<e)-1+t.readBits(e)},W=t=>{let e=l(t);return(e&1)===0?-(e>>1):e+1>>1};var M=t=>t.constructor===Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),xe=t=>t.constructor===DataView?t:ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t);var Le={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12};var De={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18};var Oe={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9};var ve=t=>[...t].map(e=>e.toString(16).padStart(2,"0")).join("");var ye=t=>(t=t>>1&1431655765|(t&1431655765)<<1,t=t>>2&858993459|(t&858993459)<<2,t=t>>4&252645135|(t&252645135)<<4,t=t>>8&16711935|(t&16711935)<<8,t=t>>16&65535|(t&65535)<<16,t>>>0);var Z=(t,e,r)=>{let i=0,o=t.length-1,s=-1;for(;i<=o;){let a=i+(o-i+1)/2|0;r(t[a])<=e?(s=a,i=a+1):o=a-1}return s};var qt=1e6*(1+Number.EPSILON);var ce=t=>{p(Number.isInteger(t.num)),p(Number.isInteger(t.den)),p(t.den!==0);let e=Math.abs(t.num),r=Math.abs(t.den);for(;r!==0;){let o=e%r;e=r,r=o}let i=e||1;return{num:t.num/i,den:t.den/i}};import{VideoSampleResource as lt,VideoSampleColorSpace as dt,VideoSample as He}from"mediabunny";import*as f from"node-av";var At=new Set([f.AV_PIX_FMT_YUVJ411P,f.AV_PIX_FMT_YUVJ420P,f.AV_PIX_FMT_YUVJ422P,f.AV_PIX_FMT_YUVJ440P,f.AV_PIX_FMT_YUVJ444P]),H=class t extends lt{get frame(){if(!this._frame)throw new Error("AvFrameVideoSampleResource has been closed.");return this._frame}constructor(e){if(super(),!(e instanceof f.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(e.getMediaType()!==f.AVMEDIA_TYPE_VIDEO)throw new Error("AvFrameVideoSampleResource must be initialized with a video frame.");this._frame=e}getFormat(){return Me(this.frame.format)}getCodedWidth(){return this.frame.width}getCodedHeight(){return this.frame.height}getSquarePixelWidth(){return this.frame.sampleAspectRatio.num>this.frame.sampleAspectRatio.den?Math.round(this.frame.width*this.frame.sampleAspectRatio.num/this.frame.sampleAspectRatio.den):this.frame.width}getSquarePixelHeight(){return this.frame.sampleAspectRatio.num>this.frame.sampleAspectRatio.den?this.frame.height:Math.round(this.frame.height*this.frame.sampleAspectRatio.den/this.frame.sampleAspectRatio.num)}getColorSpace(){return new dt({primaries:oe(this.frame.colorPrimaries),transfer:se(this.frame.colorTrc),matrix:ae(this.frame.colorSpace),fullRange:this.frame.colorRange===f.AVCOL_RANGE_JPEG||At.has(this.frame.format)?!0:this.frame.colorRange===f.AVCOL_RANGE_MPEG?!1:null})}close(){this.frame.free(),this._frame=null}getDataPlanes(){return p(this.frame.data),this.frame.data.map((e,r)=>({data:M(e),stride:this.frame.linesize[r]}))}async toRgbSample(e,r){let i=this.frame.width,o=this.frame.height,s=new f.SoftwareScaleContext,a=this.frame.format,A=be("RGBA");s.getContext(i,o,a,i,o,A,f.SWS_BILINEAR);let u=new f.Frame;u.width=i,u.height=o,u.format=A,u.alloc(),u.allocBuffer();let d=this.frame;try{await s.scaleFrame(u,d)}finally{s.freeContext()}return u.sampleAspectRatio=d.sampleAspectRatio,new He(new t(u),e)}},re=async(t,e,r)=>{p(t.format!==null),e.format=be(t.format),e.width=t.codedWidth,e.height=t.codedHeight,e.sampleAspectRatio=new f.Rational(t.pixelAspectRatio.num,t.pixelAspectRatio.den),e.colorPrimaries=Re(t.colorSpace.primaries??"unknown")??f.AVCOL_PRI_UNSPECIFIED,e.colorSpace=Ne(t.colorSpace.matrix??"unknown")??f.AVCOL_SPC_UNSPECIFIED,e.colorTrc=Ve(t.colorSpace.transfer??"unknown")??f.AVCOL_TRC_UNSPECIFIED,e.colorRange=t.colorSpace.fullRange===!1?f.AVCOL_RANGE_MPEG:t.colorSpace.fullRange===!0?f.AVCOL_RANGE_JPEG:f.AVCOL_RANGE_UNSPECIFIED;let i=t.allocationSize();return(!r||r.byteLength!==i)&&(r=Buffer.from({length:i})),await t.copyTo(r),e.fromBuffer(r),r},ze=async(t,e)=>{let r,i=!1;if(t._data instanceof H)r=t._data.frame;else{if(t.format===null)return null;r=new f.Frame,r.alloc(),i=!0,await re(t,r,null)}let o=[];(t.squarePixelWidth!==t.codedWidth||t.squarePixelHeight!==t.codedHeight)&&(o.push(`scale=${t.squarePixelWidth}:${t.squarePixelHeight}`),o.push("setsar=1")),e.rotation===90?o.push("transpose=1"):e.rotation===180?o.push("transpose=1,transpose=1"):e.rotation===270&&o.push("transpose=2"),o.push(`crop=${Math.round(e.crop.width)}:${Math.round(e.crop.height)}:${Math.round(e.crop.left)}:${Math.round(e.crop.top)}`),e.fit==="fill"?o.push(`scale=${e.width}:${e.height}`):e.fit==="contain"?(o.push(`scale=${e.width}:${e.height}:force_original_aspect_ratio=decrease`),o.push(`pad=${e.width}:${e.height}:(ow-iw)/2:(oh-ih)/2:color=black@0`)):e.fit==="cover"&&(o.push(`scale=${e.width}:${e.height}:force_original_aspect_ratio=increase`),o.push(`crop=${e.width}:${e.height}`)),o.push("setsar=1");let s=new f.FilterGraph;s.alloc();try{let a=`video_size=${r.width}x${r.height}:pix_fmt=${r.format}:time_base=1/1000000:pixel_aspect=${t.pixelAspectRatio.num}/${t.pixelAspectRatio.den}`,A=s.createFilter(f.Filter.getByName("buffer"),"src",a),u=s.createFilter(f.Filter.getByName("buffersink"),"sink");p(A&&u);let d=f.FilterInOut.createList([{name:"in",filterCtx:A,padIdx:0}]),c=f.FilterInOut.createList([{name:"out",filterCtx:u,padIdx:0}]),h=s.parsePtr(`[in]${o.join(",")}[out]`,c,d);f.FFmpegError.throwIfError(h,"FilterGraph.parsePtr");let E=await s.config();f.FFmpegError.throwIfError(E,"FilterGraph.config");let _=await A.buffersrcAddFrame(r);f.FFmpegError.throwIfError(_,"buffersrcAddFrame"),await A.buffersrcAddFrame(null);let g=new f.Frame;g.alloc();let x=await u.buffersinkGetFrame(g);return f.FFmpegError.throwIfError(x,"buffersinkGetFrame"),new He(new H(g),{timestamp:t.timestamp,duration:t.duration,rotation:0})}finally{s.free(),i&&r.free()}};var le=class extends ut{constructor(){super(...arguments);this.codecContext=null;this.preciseTimings=[]}static supports(r,i){return r==="avc"||r==="hevc"||r==="vp8"||r==="vp9"||r==="av1"}async init(){this.frame=new b.Frame,this.frame.alloc(),this.packet=new b.Packet,this.packet.alloc()}async initCodecContext(r){p(this.codecContext===null);let i=X[this.codec];p(i!==void 0);let o;if(this.codec==="vp9"&&r.sideData.alpha?o=b.Codec.findDecoderByName(b.FF_DECODER_LIBVPX_VP9)??b.Codec.findDecoder(i):this.config.hardwareAcceleration==="prefer-software"||this.codec==="av1"?o=b.Codec.findDecoder(i):o=await Pe(i)??b.Codec.findDecoder(i),!o)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let s=new b.CodecContext;s.allocContext3(o),this.pixelAspectRatio=ce({num:(this.config.displayAspectWidth??this.config.codedWidth??0)*(this.config.codedHeight??0),den:(this.config.displayAspectHeight??this.config.codedHeight??0)*(this.config.codedWidth??0)||1}),s.width=this.config.codedWidth??0,s.height=this.config.codedHeight??0,s.codecType=b.AVMEDIA_TYPE_VIDEO,s.codecId=i,s.extraData=this.config.description?Buffer.from(M(this.config.description)):null,s.sampleAspectRatio=new b.Rational(this.pixelAspectRatio.num,this.pixelAspectRatio.den);let a=await s.open2();b.FFmpegError.throwIfError(a,"Open codec context"),this.codecContext=s}async decode(r){if(this.codecContext===null&&await this.initCodecContext(r),p(this.codecContext),this.packet.isKeyframe=r.type==="key",this.packet.data=Buffer.from(r.data),this.packet.timeBase={num:1,den:1e6},this.packet.pts=BigInt(r.microsecondTimestamp),this.packet.dts=b.AV_NOPTS_VALUE,this.packet.duration=BigInt(r.microsecondDuration),r.sideData.alpha){let a=Buffer.alloc(8+r.sideData.alpha.byteLength);a[7]=1,a.set(r.sideData.alpha,8),this.packet.addSideData(b.AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,a)}let i=Z(this.preciseTimings,r.microsecondTimestamp,a=>a.microsecondTimestamp),o=i!==-1?this.preciseTimings[i]:null;o&&o.microsecondTimestamp===r.microsecondTimestamp?(o.timestamp!==r.timestamp&&(o.timestampIsValid=!1),o.duration!==r.duration&&(o.durationIsValid=!1)):(this.preciseTimings.splice(i+1,0,{microsecondTimestamp:r.microsecondTimestamp,timestamp:r.timestamp,duration:r.duration,timestampIsValid:!0,durationIsValid:!0}),this.preciseTimings.length>128&&this.preciseTimings.shift());let s=await this.codecContext.sendPacket(this.packet);for(b.FFmpegError.throwIfError(s,"Send packet"),this.packet.unref();;){let a=await this.codecContext.receiveFrame(this.frame);if(a===b.AVERROR_EAGAIN||a===b.AVERROR_EOF)break;this.receiveFrame(a)}}receiveFrame(r){b.FFmpegError.throwIfError(r,"Receive frame"),this.frame.sampleAspectRatio=new b.Rational(this.pixelAspectRatio.num,this.pixelAspectRatio.den);let i=Number(this.frame.pts)/1e6,o=Number(this.frame.duration)/1e6,s=Z(this.preciseTimings,Number(this.frame.pts),u=>u.microsecondTimestamp),a=s!==-1?this.preciseTimings[s]:null;a&&a.microsecondTimestamp===Number(this.frame.pts)&&(a.timestampIsValid&&(i=a.timestamp),a.durationIsValid&&(o=a.duration));let A=this.frame.clone();if(!A)throw new Error("Frame clone allocation failed.");this.onSample(new mt(new H(A),{timestamp:i,duration:o}))}async flush(){if(!this.codecContext)return;let r=await this.codecContext.sendPacket(null);for(b.FFmpegError.throwIfError(r,"Flush decoder");;){let i=await this.codecContext.receiveFrame(this.frame);if(i===b.AVERROR_EAGAIN||i===b.AVERROR_EOF)break;this.receiveFrame(i)}this.codecContext.flushBuffers()}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free()}};import{CustomVideoEncoder as It,QUALITY_MEDIUM as Bt,EncodedPacket as Tt}from"mediabunny";import*as m from"node-av";var O=class t{constructor(e){this.bytes=e;this.pos=0}seekToByte(e){this.pos=8*e}readBit(){let e=Math.floor(this.pos/8),r=this.bytes[e]??0,i=7-(this.pos&7),o=(r&1<<i)>>i;return this.pos++,o}readBits(e){if(e===1)return this.readBit();let r=0;for(let i=0;i<e;i++)r<<=1,r|=this.readBit();return r}writeBits(e,r){let i=this.pos+e;for(let o=this.pos;o<i;o++){let s=Math.floor(o/8),a=this.bytes[s],A=7-(o&7);a&=~(1<<A),a|=(r&1<<i-o-1)>>i-o-1<<A,this.bytes[s]=a}this.pos=i}readAlignedByte(){if(this.pos%8!==0)throw new Error("Bitstream is not byte-aligned.");let e=this.pos/8,r=this.bytes[e]??0;return this.pos+=8,r}skipBits(e){this.pos+=e}getBitsLeft(){return this.bytes.length*8-this.pos}clone(){let e=new t(this.bytes);return e.pos=this.pos,e}};var qe=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],ft=[-1,1,2,3,4,5,6,8],We=t=>{if(!t||t.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=new O(t),r=e.readBits(5);r===31&&(r=32+e.readBits(6));let i=e.readBits(4),o=null;i===15?o=e.readBits(24):i<qe.length&&(o=qe[i]);let s=e.readBits(4),a=null;return s>=1&&s<=7&&(a=ft[s]),{objectType:r,frequencyIndex:i,sampleRate:o,channelConfiguration:s,numberOfChannels:a}};var Ge=t=>{let e=new Uint8Array(7),r=new O(e),{objectType:i,frequencyIndex:o,channelConfiguration:s}=t,a=i-1;return r.writeBits(12,4095),r.writeBits(1,0),r.writeBits(2,0),r.writeBits(1,1),r.writeBits(2,a),r.writeBits(4,o),r.writeBits(1,0),r.writeBits(3,s),r.writeBits(1,0),r.writeBits(1,0),r.writeBits(1,0),r.writeBits(1,0),r.skipBits(13),r.writeBits(11,2047),r.writeBits(2,0),{header:e,bitstream:r}};var ht=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],gt=["aac","opus","mp3","vorbis","flac","ac3","eac3"],mr=[...gt,...ht];var Se=[{maxMacroblocks:99,maxBitrate:64e3,maxDpbMbs:396,level:10},{maxMacroblocks:396,maxBitrate:192e3,maxDpbMbs:900,level:11},{maxMacroblocks:396,maxBitrate:384e3,maxDpbMbs:2376,level:12},{maxMacroblocks:396,maxBitrate:768e3,maxDpbMbs:2376,level:13},{maxMacroblocks:396,maxBitrate:2e6,maxDpbMbs:2376,level:20},{maxMacroblocks:792,maxBitrate:4e6,maxDpbMbs:4752,level:21},{maxMacroblocks:1620,maxBitrate:4e6,maxDpbMbs:8100,level:22},{maxMacroblocks:1620,maxBitrate:1e7,maxDpbMbs:8100,level:30},{maxMacroblocks:3600,maxBitrate:14e6,maxDpbMbs:18e3,level:31},{maxMacroblocks:5120,maxBitrate:2e7,maxDpbMbs:20480,level:32},{maxMacroblocks:8192,maxBitrate:2e7,maxDpbMbs:32768,level:40},{maxMacroblocks:8192,maxBitrate:5e7,maxDpbMbs:32768,level:41},{maxMacroblocks:8704,maxBitrate:5e7,maxDpbMbs:34816,level:42},{maxMacroblocks:22080,maxBitrate:135e6,maxDpbMbs:110400,level:50},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:51},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:52},{maxMacroblocks:139264,maxBitrate:24e7,maxDpbMbs:696320,level:60},{maxMacroblocks:139264,maxBitrate:48e7,maxDpbMbs:696320,level:61},{maxMacroblocks:139264,maxBitrate:8e8,maxDpbMbs:696320,level:62}];var j=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:35651584,maxBitrate:18e7,level:60},{maxPictureSize:35651584,maxBitrate:24e7,level:61},{maxPictureSize:35651584,maxBitrate:48e7,level:62}];var Xe=".01.01.01.01.00",Ye=".0.110.01.01.01.0";var ie=t=>{let{codec:e,codecDescription:r,colorSpace:i,avcCodecInfo:o,hevcCodecInfo:s,vp9CodecInfo:a,av1CodecInfo:A}=t;if(e==="avc"){if(p(t.avcType!==null),o){let u=new Uint8Array([o.avcProfileIndication,o.profileCompatibility,o.avcLevelIndication]);return`avc${t.avcType}.${ve(u)}`}if(!r||r.byteLength<4)throw new TypeError("AVC decoder description is not provided or is not at least 4 bytes long.");return`avc${t.avcType}.${ve(r.subarray(1,4))}`}else if(e==="hevc"){let u,d,c,h,E,_;if(s)u=s.generalProfileSpace,d=s.generalProfileIdc,c=ye(s.generalProfileCompatibilityFlags),h=s.generalTierFlag,E=s.generalLevelIdc,_=[...s.generalConstraintIndicatorFlags];else{if(!r||r.byteLength<23)throw new TypeError("HEVC decoder description is not provided or is not at least 23 bytes long.");let x=xe(r),C=x.getUint8(1);u=C>>6&3,d=C&31,c=ye(x.getUint32(2)),h=C>>5&1,E=x.getUint8(12),_=[];for(let T=0;T<6;T++)_.push(x.getUint8(6+T))}let g="hev1.";for(g+=["","A","B","C"][u]+d,g+=".",g+=c.toString(16).toUpperCase(),g+=".",g+=h===0?"L":"H",g+=E;_.length>0&&_[_.length-1]===0;)_.pop();return _.length>0&&(g+=".",g+=_.map(x=>x.toString(16).toUpperCase()).join(".")),g}else{if(e==="vp8")return"vp8";if(e==="vp9"){if(!a){let T=t.width*t.height,y=$(j).level;for(let P of j)if(T<=P.maxPictureSize){y=P.level;break}return`vp09.00.${y.toString().padStart(2,"0")}.08`}let u=a.profile.toString().padStart(2,"0"),d=a.level.toString().padStart(2,"0"),c=a.bitDepth.toString().padStart(2,"0"),h=a.chromaSubsampling.toString().padStart(2,"0"),E=a.colourPrimaries.toString().padStart(2,"0"),_=a.transferCharacteristics.toString().padStart(2,"0"),g=a.matrixCoefficients.toString().padStart(2,"0"),x=a.videoFullRangeFlag.toString().padStart(2,"0"),C=`vp09.${u}.${d}.${c}.${h}`;return C+=`.${E}.${_}.${g}.${x}`,C.endsWith(Xe)&&(C=C.slice(0,-Xe.length)),C}else if(e==="av1"){if(!A){let P=t.width*t.height,V=$(j).level;for(let w of j)if(P<=w.maxPictureSize){V=w.level;break}return`av01.0.${V.toString().padStart(2,"0")}M.08`}let u=A.profile,d=A.level.toString().padStart(2,"0"),c=A.tier?"H":"M",h=A.bitDepth.toString().padStart(2,"0"),E=A.monochrome?"1":"0",_=100*A.chromaSubsamplingX+10*A.chromaSubsamplingY+1*(A.chromaSubsamplingX&&A.chromaSubsamplingY?A.chromaSamplePosition:0),g=i?.primaries?Le[i.primaries]:1,x=i?.transfer?De[i.transfer]:1,C=i?.matrix?Oe[i.matrix]:1,T=i?.fullRange?1:0,y=`av01.${u}.${d}${c}.${h}`;return y+=`.${E}.${_.toString().padStart(3,"0")}`,y+=`.${g.toString().padStart(2,"0")}`,y+=`.${x.toString().padStart(2,"0")}`,y+=`.${C.toString().padStart(2,"0")}`,y+=`.${T}`,y.endsWith(Ye)&&(y=y.slice(0,-Ye.length)),y}}throw new TypeError(`Unhandled codec '${e}'.`)};var Ae=function*(t){let e=0,r=-1;for(;e<t.length-2;){let i=t.indexOf(0,e);if(i===-1||i>=t.length-2)break;e=i;let o=0;if(e+3<t.length&&t[e+1]===0&&t[e+2]===0&&t[e+3]===1?o=4:t[e+1]===0&&t[e+2]===1&&(o=3),o===0){e++;continue}r!==-1&&e>r&&(yield{offset:r,length:e-r}),r=e+o,e=r}r!==-1&&r<t.length&&(yield{offset:r,length:t.length-r})};var Ee=t=>t&31,_e=t=>{let e=[],r=t.length;for(let i=0;i<r;i++)i+2<r&&t[i]===0&&t[i+1]===0&&t[i+2]===3?(e.push(0,0),i+=2):e.push(t[i]);return new Uint8Array(e)},Tr=new Uint8Array([0,0,0,1]);var Je=t=>{try{let e=[],r=[],i=[];for(let A of Ae(t)){let u=t.subarray(A.offset,A.offset+A.length),d=Ee(u[0]);d===7?e.push(u):d===8?r.push(u):d===13&&i.push(u)}if(e.length===0||r.length===0)return null;let o=e[0],s=Ct(o);p(s!==null);let a=s.profileIdc===100||s.profileIdc===110||s.profileIdc===122||s.profileIdc===144;return{configurationVersion:1,avcProfileIndication:s.profileIdc,profileCompatibility:s.constraintFlags,avcLevelIndication:s.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:e,pictureParameterSets:r,chromaFormat:a?s.chromaFormatIdc:null,bitDepthLumaMinus8:a?s.bitDepthLumaMinus8:null,bitDepthChromaMinus8:a?s.bitDepthChromaMinus8:null,sequenceParameterSetExt:a?i:null}}catch(e){return console.error("Error building AVC Decoder Configuration Record:",e),null}},je=t=>{let e=[];e.push(t.configurationVersion),e.push(t.avcProfileIndication),e.push(t.profileCompatibility),e.push(t.avcLevelIndication),e.push(252|t.lengthSizeMinusOne&3),e.push(224|t.sequenceParameterSets.length&31);for(let r of t.sequenceParameterSets){let i=r.byteLength;e.push(i>>8),e.push(i&255);for(let o=0;o<i;o++)e.push(r[o])}e.push(t.pictureParameterSets.length);for(let r of t.pictureParameterSets){let i=r.byteLength;e.push(i>>8),e.push(i&255);for(let o=0;o<i;o++)e.push(r[o])}if(t.avcProfileIndication===100||t.avcProfileIndication===110||t.avcProfileIndication===122||t.avcProfileIndication===144){p(t.chromaFormat!==null),p(t.bitDepthLumaMinus8!==null),p(t.bitDepthChromaMinus8!==null),p(t.sequenceParameterSetExt!==null),e.push(252|t.chromaFormat&3),e.push(248|t.bitDepthLumaMinus8&7),e.push(248|t.bitDepthChromaMinus8&7),e.push(t.sequenceParameterSetExt.length);for(let r of t.sequenceParameterSetExt){let i=r.byteLength;e.push(i>>8),e.push(i&255);for(let o=0;o<i;o++)e.push(r[o])}}return new Uint8Array(e)};var $e={1:{num:1,den:1},2:{num:12,den:11},3:{num:10,den:11},4:{num:16,den:11},5:{num:40,den:33},6:{num:24,den:11},7:{num:20,den:11},8:{num:32,den:11},9:{num:80,den:33},10:{num:18,den:11},11:{num:15,den:11},12:{num:64,den:33},13:{num:160,den:99},14:{num:4,den:3},15:{num:3,den:2},16:{num:2,den:1}},Ct=t=>{try{let e=new O(_e(t));if(e.skipBits(1),e.skipBits(2),e.readBits(5)!==7)return null;let i=e.readAlignedByte(),o=e.readAlignedByte(),s=e.readAlignedByte();l(e);let a=1,A=0,u=0,d=0;if((i===100||i===110||i===122||i===244||i===44||i===83||i===86||i===118||i===128)&&(a=l(e),a===3&&(d=e.readBits(1)),A=l(e),u=l(e),e.skipBits(1),e.readBits(1))){for(let S=0;S<(a!==3?8:12);S++)if(e.readBits(1)){let K=S<6?16:64,L=8,R=8;for(let D=0;D<K;D++){if(R!==0){let J=W(e);R=(L+J+256)%256}L=R===0?L:R}}}l(e);let c=l(e);if(c===0)l(e);else if(c===1){e.skipBits(1),W(e),W(e);let k=l(e);for(let S=0;S<k;S++)W(e)}l(e),e.skipBits(1);let h=l(e),E=l(e),_=16*(h+1),g=16*(E+1),x=_,C=g,T=e.readBits(1);if(T||e.skipBits(1),e.skipBits(1),e.readBits(1)){let k=l(e),S=l(e),q=l(e),K=l(e),L,R;if((d===0?a:0)===0)L=1,R=2-T;else{let J=a===3?1:2,te=a===1?2:1;L=J,R=te*(2-T)}x-=L*(k+S),C-=R*(q+K)}let P=2,V=2,w=2,B=0,N={num:1,den:1},F=null,U=null;if(e.readBits(1)){if(e.readBits(1)){let te=e.readBits(8);if(te===255)N={num:e.readBits(16),den:e.readBits(16)};else{let Ie=$e[te];Ie&&(N=Ie)}}e.readBits(1)&&e.skipBits(1),e.readBits(1)&&(e.skipBits(3),B=e.readBits(1),e.readBits(1)&&(P=e.readBits(8),V=e.readBits(8),w=e.readBits(8))),e.readBits(1)&&(l(e),l(e)),e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.skipBits(1));let R=e.readBits(1);R&&Ke(e);let D=e.readBits(1);D&&Ke(e),(R||D)&&e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(1),l(e),l(e),l(e),l(e),F=l(e),U=l(e))}if(F===null){p(U===null);let k=o&16;if((i===44||i===86||i===100||i===110||i===122||i===244)&&k)F=0,U=0;else{let S=h+1,q=E+1,K=(2-T)*q,L=Se.find(D=>D.level>=s)??$(Se),R=Math.min(Math.floor(L.maxDpbMbs/(S*K)),16);F=R,U=R}}return p(U!==null),{profileIdc:i,constraintFlags:o,levelIdc:s,frameMbsOnlyFlag:T,chromaFormatIdc:a,bitDepthLumaMinus8:A,bitDepthChromaMinus8:u,codedWidth:_,codedHeight:g,displayWidth:x,displayHeight:C,pixelAspectRatio:N,colourPrimaries:P,matrixCoefficients:w,transferCharacteristics:V,fullRangeFlag:B,numReorderFrames:F,maxDecFrameBuffering:U}}catch(e){return console.error("Error parsing AVC SPS:",e),null}},Ke=t=>{let e=l(t);t.skipBits(4),t.skipBits(4);for(let r=0;r<=e;r++)l(t),l(t),t.skipBits(1);t.skipBits(5),t.skipBits(5),t.skipBits(5),t.skipBits(5)};var de=t=>t>>1&63,bt=t=>{try{let e=new O(_e(t));e.skipBits(16),e.readBits(4);let r=e.readBits(3),i=e.readBits(1),{general_profile_space:o,general_tier_flag:s,general_profile_idc:a,general_profile_compatibility_flags:A,general_constraint_indicator_flags:u,general_level_idc:d}=xt(e,r);l(e);let c=l(e),h=0;c===3&&(h=e.readBits(1));let E=l(e),_=l(e),g=E,x=_;if(e.readBits(1)){let S=l(e),q=l(e),K=l(e),L=l(e),R=1,D=1,J=h===0?c:0;J===1?(R=2,D=2):J===2&&(R=2,D=1),g-=(S+q)*R,x-=(K+L)*D}let C=l(e),T=l(e);l(e);let P=e.readBits(1)?0:r,V=0;for(let S=P;S<=r;S++)l(e),V=l(e),l(e);l(e),l(e),l(e),l(e),l(e),l(e),e.readBits(1)&&e.readBits(1)&&vt(e),e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(4),e.skipBits(4),l(e),l(e),e.skipBits(1));let w=l(e);if(yt(e,w),e.readBits(1)){let S=l(e);for(let q=0;q<S;q++)l(e),e.skipBits(1)}e.skipBits(1),e.skipBits(1);let B=2,N=2,F=2,U=0,ne=0,k={num:1,den:1};if(e.readBits(1)){let S=Et(e,r);k=S.pixelAspectRatio,B=S.colourPrimaries,N=S.transferCharacteristics,F=S.matrixCoefficients,U=S.fullRangeFlag,ne=S.minSpatialSegmentationIdc}return{displayWidth:g,displayHeight:x,pixelAspectRatio:k,colourPrimaries:B,transferCharacteristics:N,matrixCoefficients:F,fullRangeFlag:U,maxDecFrameBuffering:V+1,spsMaxSubLayersMinus1:r,spsTemporalIdNestingFlag:i,generalProfileSpace:o,generalTierFlag:s,generalProfileIdc:a,generalProfileCompatibilityFlags:A,generalConstraintIndicatorFlags:u,generalLevelIdc:d,chromaFormatIdc:c,bitDepthLumaMinus8:C,bitDepthChromaMinus8:T,minSpatialSegmentationIdc:ne}}catch(e){return console.error("Error parsing HEVC SPS:",e),null}},Ze=t=>{try{let e=[],r=[],i=[],o=[];for(let d of Ae(t)){let c=t.subarray(d.offset,d.offset+d.length),h=de(c[0]);h===32?e.push(c):h===33?r.push(c):h===34?i.push(c):(h===39||h===40)&&o.push(c)}if(r.length===0||i.length===0)return null;let s=bt(r[0]);if(!s)return null;let a=0;if(i.length>0){let d=i[0],c=new O(_e(d));c.skipBits(16),l(c),l(c),c.skipBits(1),c.skipBits(1),c.skipBits(3),c.skipBits(1),c.skipBits(1),l(c),l(c),W(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&l(c),W(c),W(c),c.skipBits(1),c.skipBits(1),c.skipBits(1),c.skipBits(1);let h=c.readBits(1),E=c.readBits(1);!h&&!E?a=0:h&&!E?a=2:!h&&E?a=3:a=0}let A=[...e.length?[{arrayCompleteness:1,nalUnitType:32,nalUnits:e}]:[],...r.length?[{arrayCompleteness:1,nalUnitType:33,nalUnits:r}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:34,nalUnits:i}]:[],...o.length?[{arrayCompleteness:1,nalUnitType:de(o[0][0]),nalUnits:o}]:[]];return{configurationVersion:1,generalProfileSpace:s.generalProfileSpace,generalTierFlag:s.generalTierFlag,generalProfileIdc:s.generalProfileIdc,generalProfileCompatibilityFlags:s.generalProfileCompatibilityFlags,generalConstraintIndicatorFlags:s.generalConstraintIndicatorFlags,generalLevelIdc:s.generalLevelIdc,minSpatialSegmentationIdc:s.minSpatialSegmentationIdc,parallelismType:a,chromaFormatIdc:s.chromaFormatIdc,bitDepthLumaMinus8:s.bitDepthLumaMinus8,bitDepthChromaMinus8:s.bitDepthChromaMinus8,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:s.spsMaxSubLayersMinus1+1,temporalIdNested:s.spsTemporalIdNestingFlag,lengthSizeMinusOne:3,arrays:A}}catch(e){return console.error("Error building HEVC Decoder Configuration Record:",e),null}},xt=(t,e)=>{let r=t.readBits(2),i=t.readBits(1),o=t.readBits(5),s=0;for(let c=0;c<32;c++)s=s<<1|t.readBits(1);let a=new Uint8Array(6);for(let c=0;c<6;c++)a[c]=t.readBits(8);let A=t.readBits(8),u=[],d=[];for(let c=0;c<e;c++)u.push(t.readBits(1)),d.push(t.readBits(1));if(e>0)for(let c=e;c<8;c++)t.skipBits(2);for(let c=0;c<e;c++)u[c]&&t.skipBits(88),d[c]&&t.skipBits(8);return{general_profile_space:r,general_tier_flag:i,general_profile_idc:o,general_profile_compatibility_flags:s,general_constraint_indicator_flags:a,general_level_idc:A}},vt=t=>{for(let e=0;e<4;e++)for(let r=0;r<(e===3?2:6);r++)if(!t.readBits(1))l(t);else{let o=Math.min(64,1<<4+(e<<1));e>1&&W(t);for(let s=0;s<o;s++)W(t)}},yt=(t,e)=>{let r=[];for(let i=0;i<e;i++)r[i]=St(t,i,e,r)},St=(t,e,r,i)=>{let o=0,s=0,a=0;if(e!==0&&(s=t.readBits(1)),s){if(e===r){let u=l(t);a=e-(u+1)}else a=e-1;t.readBits(1),l(t);let A=i[a]??0;for(let u=0;u<=A;u++)t.readBits(1)||t.readBits(1);o=i[a]}else{let A=l(t),u=l(t);for(let d=0;d<A;d++)l(t),t.readBits(1);for(let d=0;d<u;d++)l(t),t.readBits(1);o=A+u}return o},Et=(t,e)=>{let r=2,i=2,o=2,s=0,a=0,A={num:1,den:1};if(t.readBits(1)){let u=t.readBits(8);if(u===255)A={num:t.readBits(16),den:t.readBits(16)};else{let d=$e[u];d&&(A=d)}}return t.readBits(1)&&t.readBits(1),t.readBits(1)&&(t.readBits(3),s=t.readBits(1),t.readBits(1)&&(r=t.readBits(8),i=t.readBits(8),o=t.readBits(8))),t.readBits(1)&&(l(t),l(t)),t.readBits(1),t.readBits(1),t.readBits(1),t.readBits(1)&&(l(t),l(t),l(t),l(t)),t.readBits(1)&&(t.readBits(32),t.readBits(32),t.readBits(1)&&l(t),t.readBits(1)&&_t(t,!0,e)),t.readBits(1)&&(t.readBits(1),t.readBits(1),t.readBits(1),a=l(t),l(t),l(t),l(t),l(t)),{pixelAspectRatio:A,colourPrimaries:r,transferCharacteristics:i,matrixCoefficients:o,fullRangeFlag:s,minSpatialSegmentationIdc:a}},_t=(t,e,r)=>{let i=!1,o=!1,s=!1;e&&(i=t.readBits(1)===1,o=t.readBits(1)===1,(i||o)&&(s=t.readBits(1)===1,s&&(t.readBits(8),t.readBits(5),t.readBits(1),t.readBits(5)),t.readBits(4),t.readBits(4),s&&t.readBits(4),t.readBits(5),t.readBits(5),t.readBits(5)));for(let a=0;a<=r;a++){let A=t.readBits(1)===1,u=!0;A||(u=t.readBits(1)===1);let d=!1;u?l(t):d=t.readBits(1)===1;let c=1;d||(c=l(t)+1),i&&Qe(t,c,s),o&&Qe(t,c,s)}},Qe=(t,e,r)=>{for(let i=0;i<e;i++)l(t),l(t),r&&(l(t),l(t)),t.readBits(1)},et=t=>{let e=[];e.push(t.configurationVersion),e.push((t.generalProfileSpace&3)<<6|(t.generalTierFlag&1)<<5|t.generalProfileIdc&31),e.push(t.generalProfileCompatibilityFlags>>>24&255),e.push(t.generalProfileCompatibilityFlags>>>16&255),e.push(t.generalProfileCompatibilityFlags>>>8&255),e.push(t.generalProfileCompatibilityFlags&255),e.push(...t.generalConstraintIndicatorFlags),e.push(t.generalLevelIdc&255),e.push(240|t.minSpatialSegmentationIdc>>8&15),e.push(t.minSpatialSegmentationIdc&255),e.push(252|t.parallelismType&3),e.push(252|t.chromaFormatIdc&3),e.push(248|t.bitDepthLumaMinus8&7),e.push(248|t.bitDepthChromaMinus8&7),e.push(t.avgFrameRate>>8&255),e.push(t.avgFrameRate&255),e.push((t.constantFrameRate&3)<<6|(t.numTemporalLayers&7)<<3|(t.temporalIdNested&1)<<2|t.lengthSizeMinusOne&3),e.push(t.arrays.length&255);for(let r of t.arrays){e.push((r.arrayCompleteness&1)<<7|0|r.nalUnitType&63),e.push(r.nalUnits.length>>8&255),e.push(r.nalUnits.length&255);for(let i of r.nalUnits){e.push(i.length>>8&255),e.push(i.length&255);for(let o=0;o<i.length;o++)e.push(i[o])}}return new Uint8Array(e)};var tt=t=>{let e=new O(t);if(e.readBits(2)!==2)return null;let i=e.readBits(1),s=(e.readBits(1)<<1)+i;if(s===3&&e.skipBits(1),e.readBits(1)===1||e.readBits(1)!==0||(e.skipBits(2),e.readBits(24)!==4817730))return null;let d=8;s>=2&&(d=e.readBits(1)?12:10);let c=e.readBits(3),h=0,E=0;if(c!==7)if(E=e.readBits(1),s===1||s===3){let N=e.readBits(1),F=e.readBits(1);h=!N&&!F?3:N&&!F?2:1,e.skipBits(1)}else h=1;else h=3,E=1;let _=e.readBits(16),g=e.readBits(16),x=_+1,C=g+1,T=x*C,y=$(j).level;for(let B of j)if(T<=B.maxPictureSize){y=B.level;break}return{profile:s,level:y,bitDepth:d,chromaSubsampling:h,videoFullRangeFlag:E,colourPrimaries:c===2?1:c===1?6:2,transferCharacteristics:c===2?1:c===1?6:2,matrixCoefficients:c===7?0:c===2?1:c===1?6:2}},wt=function*(t){let e=new O(t),r=()=>{let i=0;for(let o=0;o<8;o++){let s=e.readAlignedByte();if(i|=(s&127)<<o*7,!(s&128))break;if(o===7&&s&128)return null}return i>=2**32-1?null:i};for(;e.getBitsLeft()>=8;){e.skipBits(1);let i=e.readBits(4),o=e.readBits(1),s=e.readBits(1);e.skipBits(1),o&&e.skipBits(8);let a;if(s){let A=r();if(A===null)return;a=A}else a=Math.floor(e.getBitsLeft()/8);p(e.pos%8===0),yield{type:i,data:t.subarray(e.pos/8,e.pos/8+a)},e.skipBits(a*8)}},rt=t=>{for(let{type:e,data:r}of wt(t)){if(e!==1)continue;let i=new O(r),o=i.readBits(3),s=i.readBits(1),a=i.readBits(1),A=0,u=0,d=0;if(a)A=i.readBits(5);else{if(i.readBits(1)&&(i.skipBits(32),i.skipBits(32),i.readBits(1)))return null;let B=i.readBits(1);B&&(d=i.readBits(5),i.skipBits(32),i.skipBits(5),i.skipBits(5));let N=i.readBits(5);for(let F=0;F<=N;F++){i.skipBits(12);let U=i.readBits(5);if(F===0&&(A=U),U>7){let k=i.readBits(1);F===0&&(u=k)}if(B&&i.readBits(1)){let S=d+1;i.skipBits(S),i.skipBits(S),i.skipBits(1)}i.readBits(1)&&i.skipBits(4)}}let c=i.readBits(4),h=i.readBits(4),E=c+1;i.skipBits(E);let _=h+1;i.skipBits(_);let g=0;if(a?g=0:g=i.readBits(1),g&&(i.skipBits(4),i.skipBits(3)),i.skipBits(1),i.skipBits(1),i.skipBits(1),!a){i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);let w=i.readBits(1);w&&(i.skipBits(1),i.skipBits(1));let B=i.readBits(1),N=0;B?N=2:N=i.readBits(1),N>0&&(i.readBits(1)||i.skipBits(1)),w&&i.skipBits(3)}i.skipBits(1),i.skipBits(1),i.skipBits(1);let x=i.readBits(1),C=8;o===2&&x?C=i.readBits(1)?12:10:o<=2&&(C=x?10:8);let T=0;o!==1&&(T=i.readBits(1));let y=1,P=1,V=0;return T||(o===0?(y=1,P=1):o===1?(y=0,P=0):C===12&&(y=i.readBits(1),y&&(P=i.readBits(1))),y&&P&&(V=i.readBits(2))),{profile:o,level:A,tier:u,bitDepth:C,monochrome:T,chromaSubsamplingX:y,chromaSubsamplingY:P,chromaSamplePosition:V}}return null};var Pr=[64*2,69*2,96*2,64*2,70*2,96*2,80*2,87*2,120*2,80*2,88*2,120*2,96*2,104*2,144*2,96*2,105*2,144*2,112*2,121*2,168*2,112*2,122*2,168*2,128*2,139*2,192*2,128*2,140*2,192*2,160*2,174*2,240*2,160*2,175*2,240*2,192*2,208*2,288*2,192*2,209*2,288*2,224*2,243*2,336*2,224*2,244*2,336*2,256*2,278*2,384*2,256*2,279*2,384*2,320*2,348*2,480*2,320*2,349*2,480*2,384*2,417*2,576*2,384*2,418*2,576*2,448*2,487*2,672*2,448*2,488*2,672*2,512*2,557*2,768*2,512*2,558*2,768*2,640*2,696*2,960*2,640*2,697*2,960*2,768*2,835*2,1152*2,768*2,836*2,1152*2,896*2,975*2,1344*2,896*2,976*2,1344*2,1024*2,1114*2,1536*2,1024*2,1115*2,1536*2,1152*2,1253*2,1728*2,1152*2,1254*2,1728*2,1280*2,1393*2,1920*2,1280*2,1394*2,1920*2];var Fr=new Uint8Array([5,4,65,67,45,51]),Rr=new Uint8Array([5,4,69,65,67,51]);var ue=class extends It{constructor(){super(...arguments);this.codecContext=null;this.scaler=null;this.dstFrame=null;this.lastBuffer=null;this.packetEmitted=!1;this.lastScalerKey=null;this.preciseTimings=[]}static supports(r,i){return(r==="avc"||r==="hevc"||r==="vp8"||r==="vp9"||r==="av1")&&i.bitrateMode!=="quantizer"}async init(){this.frame=new m.Frame,this.frame.alloc(),this.frame.timeBase=new m.Rational(1,1e6),this.packet=new m.Packet,this.packet.alloc();let r=X[this.codec];p(r!==void 0);let i=null;if(this.codec==="vp9"&&this.config.alpha==="keep"?i=m.Codec.findEncoderByName(m.FF_ENCODER_LIBVPX_VP9)??m.Codec.findEncoder(r):this.config.hardwareAcceleration==="prefer-software"?i=m.Codec.findEncoder(r):i=await Fe(r)??m.Codec.findEncoder(r),!i)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=i,await this.createCodecContext()}async createCodecContext(){p(this.codecContext===null);let r=new m.CodecContext;r.allocContext3(this.avCodec);let i=m.AV_PIX_FMT_YUV420P;this.avCodec.pixelFormats&&(this.avCodec.pixelFormats.includes(m.AV_PIX_FMT_YUV420P)||(i=this.avCodec.pixelFormats[0]),this.config.alpha==="keep"&&this.avCodec.pixelFormats.includes(m.AV_PIX_FMT_YUVA420P)&&(i=m.AV_PIX_FMT_YUVA420P));let o=ce({num:(this.config.displayWidth??this.config.width)*this.config.height,den:(this.config.displayHeight??this.config.height)*this.config.width});r.width=this.config.width,r.height=this.config.height,r.pixelFormat=i,r.timeBase=new m.Rational(1,1e6),r.gopSize=60,r.framerate=new m.Rational(Math.round(this.config.framerate??0)||30,1),r.bitRate=BigInt(this.config.bitrate??Bt._toVideoBitrate(this.codec,this.config.width,this.config.height)),r.sampleAspectRatio=new m.Rational(o.num,o.den),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let s=this.config.latencyMode==="realtime";this.avCodec.name==="libx264"?s&&(r.setOption("tune","zerolatency"),r.setOption("preset","ultrafast")):this.avCodec.name==="libx265"?(r.setOption("x265-params","log-level=error"),s&&(r.setOption("tune","zerolatency"),r.setOption("preset","ultrafast"))):this.avCodec.name==="libvpx"?(s&&r.setOption("deadline","realtime"),r.setOption("cpu-used","8")):this.avCodec.name==="libvpx-vp9"?(r.setOption("deadline","realtime"),s?r.setOption("cpu-used","8"):r.setOption("cpu-used","5")):this.avCodec.name==="libsvtav1"&&(process.env.SVT_LOG="1",s&&r.setOption("preset","12"));let a=await r.open2();m.FFmpegError.throwIfError(a,"Open codec context"),this.codecContext=r}async encode(r,i){if(this.codecContext===null&&await this.createCodecContext(),p(this.codecContext),r._data instanceof H)this.frame.unref(),this.frame.ref(r._data.frame);else{if(r.format===null)throw new Error("Cannot encode foreign VideoSample with unknown (null) format.");this.lastBuffer=await re(r,this.frame,this.lastBuffer)}let o=this.frame;if(this.codecContext.pixelFormat!==this.frame.format||this.codecContext.width!==this.frame.width||this.codecContext.height!==this.frame.height){this.scaler||(this.scaler=new m.SoftwareScaleContext);let d=`${this.frame.width}x${this.frame.height}:${this.frame.format}`;if(d!==this.lastScalerKey){this.scaler.getContext(this.frame.width,this.frame.height,this.frame.format,this.codecContext.width,this.codecContext.height,this.codecContext.pixelFormat,m.SWS_FAST_BILINEAR),this.lastScalerKey=d;let h=this.scaler.initContext();m.FFmpegError.throwIfError(h,"initContext")}this.dstFrame||(this.dstFrame=new m.Frame,this.dstFrame.alloc(),this.dstFrame.width=this.codecContext.width,this.dstFrame.height=this.codecContext.height,this.dstFrame.format=this.codecContext.pixelFormat,this.dstFrame.allocBuffer()),await this.scaler.scaleFrame(this.dstFrame,this.frame),this.dstFrame.copyProps(this.frame),o=this.dstFrame}o.pts=BigInt(r.microsecondTimestamp),o.duration=BigInt(r.microsecondDuration),o.timeBase=new m.Rational(1,1e6),o.pictType=i?.keyFrame?m.AV_PICTURE_TYPE_I:m.AV_PICTURE_TYPE_NONE,o.keyFrame=i?.keyFrame?1:0;let a=Z(this.preciseTimings,r.microsecondTimestamp,d=>d.microsecondTimestamp),A=a!==-1?this.preciseTimings[a]:null;A&&A.microsecondTimestamp===r.microsecondTimestamp?(A.timestamp!==r.timestamp&&(A.timestampIsValid=!1),A.duration!==r.duration&&(A.durationIsValid=!1)):(this.preciseTimings.splice(a+1,0,{microsecondTimestamp:r.microsecondTimestamp,timestamp:r.timestamp,duration:r.duration,timestampIsValid:!0,durationIsValid:!0}),this.preciseTimings.length>128&&this.preciseTimings.shift());let u=await this.codecContext.sendFrame(o);for(m.FFmpegError.throwIfError(u,"Send frame");;){let d=await this.codecContext.receivePacket(this.packet);if(d===m.AVERROR_EAGAIN||d===m.AVERROR_EOF)break;this.receivePacket(d)}}receivePacket(r){if(p(this.codecContext),m.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let i=M(this.packet.data),o=Number(this.packet.pts)/1e6,s=Number(this.packet.duration)/1e6,a=Z(this.preciseTimings,Number(this.packet.pts),g=>g.microsecondTimestamp),A=a!==-1?this.preciseTimings[a]:null;A&&A.microsecondTimestamp===Number(this.packet.pts)&&(A.timestampIsValid&&(o=A.timestamp),A.durationIsValid&&(s=A.duration));let u={},d=null,c=null;if(this.codec==="avc"||this.codec==="hevc"){let g=!1;if(this.codec==="avc"?g=this.config.avc?.format==="annexb":g=this.config.hevc?.format==="annexb",!this.packetEmitted){let x;if(this.codec==="avc"){let C=Je(this.packet.data);if(!C)throw new Error("Invalid AVC data, could not extract decoder configuration record.");x=je(C)}else{let C=Ze(this.packet.data);if(!C)throw new Error("Invalid HEVC data, could not extract decoder configuration record.");x=et(C)}d=ie({width:this.config.width,height:this.config.height,codec:this.codec,codecDescription:x,colorSpace:null,avcType:1,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}),g||(c=x)}if(!g){let C=[];for(let w of Ae(i))if(this.codec==="avc"){let B=Ee(i[w.offset]);B!==7&&B!==8&&B!==13&&C.push(w)}else{let B=de(i[w.offset]);B!==33&&B!==34&&B!==32&&C.push(w)}let T=0;for(let w of C)T+=4+w.length;let y=new Uint8Array(T),P=new DataView(y.buffer),V=0;for(let w of C){let B=w.length;P.setUint32(V,B,!1),V+=4,y.set(i.subarray(w.offset,w.offset+w.length),V),V+=w.length}i=y}}else if(this.codec==="vp8")this.packetEmitted||(d=ie({width:this.config.width,height:this.config.height,codec:"vp8",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null}));else if(this.codec==="vp9"){if(!this.packetEmitted){let g=tt(i);d=ie({width:this.config.width,height:this.config.height,codec:"vp9",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:g,av1CodecInfo:null})}}else if(this.codec==="av1"){if(!this.packetEmitted){let g=rt(i);d=ie({width:this.config.width,height:this.config.height,codec:"av1",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:g})}}else throw new Error("Unreachable.");let h={},E=this.packet.getSideData(m.AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL);E&&(h.alpha=M(E).subarray(8));let _=new Tt(i,this.packet.isKeyframe?"key":"delta",o,s,void 0,void 0,h);d!==null&&(u.decoderConfig={codec:d,codedWidth:this.codecContext.width,codedHeight:this.codecContext.height,displayAspectWidth:this.config.displayWidth??this.codecContext.width,displayAspectHeight:this.config.displayHeight??this.codecContext.height,description:c??void 0,colorSpace:{primaries:oe(this.codecContext.colorPrimaries),matrix:ae(this.codecContext.colorSpace),transfer:se(this.codecContext.colorTrc),fullRange:this.codecContext.colorRange===m.AVCOL_RANGE_JPEG?!0:this.codecContext.colorRange===m.AVCOL_RANGE_MPEG?!1:void 0}}),this.packetEmitted=!0,this.onPacket(_,u)}async flush(){if(this.codecContext){let r=await this.codecContext.sendFrame(null);for(m.FFmpegError.throwIfError(r,"Send frame");;){let i=await this.codecContext.receivePacket(this.packet);if(i===m.AVERROR_EAGAIN||i===m.AVERROR_EOF)break;this.receivePacket(i)}this.codecContext.freeContext(),this.codecContext=null}this.packetEmitted=!1}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free(),this.scaler?.freeContext(),this.dstFrame?.free()}};import{AudioSample as Ft,CustomAudioDecoder as Rt}from"mediabunny";import*as I from"node-av";import{AudioSampleResource as Pt}from"mediabunny";import*as ee from"node-av";var Y=class extends Pt{get frame(){if(!this._frame)throw new Error("AvFrameAudioSampleResource has been closed.");return this._frame}constructor(e){if(super(),!(e instanceof ee.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(e.getMediaType()!==ee.AVMEDIA_TYPE_AUDIO)throw new Error("AvFrameAudioSampleResource must be initialized with an audio frame.");this._frame=e}getFormat(){let e=ke(this.frame.format);if(e===null){let r=ee.avGetSampleFmtName(this.frame.format);throw new TypeError(`Unsupported audio sample format: ${r} (${this.frame.format})`)}return e}getSampleRate(){return this.frame.sampleRate}getNumberOfChannels(){return this.frame.channels}getNumberOfFrames(){return this.frame.nbSamples}getTimestamp(){return Number(this.frame.pts)/this.frame.timeBase.den}close(){this.frame.free(),this._frame=null}getDataPlane(e){return p(this.frame.data&&e<this.frame.data.length),M(this.frame.data[e])}},me=(t,e)=>{e.format=Ue(t.format),e.nbSamples=t.numberOfFrames,e.sampleRate=t.sampleRate,e.channelLayout=Q(t.numberOfChannels),e.allocBuffer(),p(e.data);for(let r=0;r<e.data.length;r++)t.copyTo(e.data[r],{planeIndex:r})};var fe=class extends Rt{constructor(){super(...arguments);this.codecContext=null}static supports(r,i){return r==="aac"||r==="opus"||r==="mp3"||r==="vorbis"||r==="flac"||r==="ac3"||r==="eac3"}async init(){this.frame=new I.Frame,this.frame.alloc(),this.packet=new I.Packet,this.packet.alloc();let r=X[this.codec];p(r!==void 0);let i=I.Codec.findDecoder(r);if(i===null)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let o=new I.CodecContext;o.allocContext3(i),o.sampleRate=this.config.sampleRate,o.channelLayout=Q(this.config.numberOfChannels),o.timeBase=new I.Rational(1,this.config.sampleRate),o.codecType=I.AVMEDIA_TYPE_AUDIO,o.codecId=r,o.extraData=this.config.description?Buffer.from(M(this.config.description)):null;let s=await o.open2();I.FFmpegError.throwIfError(s,"Open codec context"),this.codecContext=o}async decode(r){p(this.codecContext),this.packet.isKeyframe=r.type==="key",this.packet.data=Buffer.from(r.data),this.packet.timeBase={num:1,den:this.config.sampleRate},this.packet.pts=BigInt(Math.round(r.timestamp*this.config.sampleRate)),this.packet.dts=I.AV_NOPTS_VALUE,this.packet.duration=BigInt(Math.round(r.duration*this.config.sampleRate));let i=await this.codecContext.sendPacket(this.packet);for(I.FFmpegError.throwIfError(i,"Send packet"),this.packet.unref();;){let o=await this.codecContext.receiveFrame(this.frame);if(o===I.AVERROR_EAGAIN||o===I.AVERROR_EOF)break;this.receiveFrame(o)}}receiveFrame(r){I.FFmpegError.throwIfError(r,"Receive frame");let i=this.frame.clone();if(!i)throw new Error("Allocation failure during frame clone.");i.timeBase=new I.Rational(1,this.config.sampleRate),this.onSample(new Ft(new Y(i)))}async flush(){p(this.codecContext);let r=await this.codecContext.sendPacket(null);for(I.FFmpegError.throwIfError(r,"Flush decoder");;){let i=await this.codecContext.receiveFrame(this.frame);if(i===I.AVERROR_EAGAIN||i===I.AVERROR_EOF)break;this.receiveFrame(i)}this.codecContext.flushBuffers()}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free()}};import{CustomAudioEncoder as Vt,QUALITY_MEDIUM as Nt,EncodedPacket as Mt}from"mediabunny";import*as v from"node-av";var kt=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],Ut=[8e3,12e3,16e3,24e3,48e3],Lt=[8e3,11025,12e3,16e3,22050,24e3,32e3,44100,48e3],it=[32e3,44100,48e3],we=1024,pe=class extends Vt{constructor(){super(...arguments);this.codecContext=null;this.resampler=null;this.dstFrame=null;this.firstExpectedTimestamp=null;this.outputTimestampOffset=0;this.inputParametersKey=null;this.resamplerInputSampleRate=null;this.nextResamplerPts=null;this.packetEmitted=!1;this.adtsHeaderTemplate=null}static supports(r,i){let{numberOfChannels:o,sampleRate:s}=i;return r==="aac"&&o>=1&&o<=48&&kt.includes(s)||r==="opus"&&o>=1&&o<=255&&Ut.includes(s)||r==="mp3"&&o>=1&&o<=2&&Lt.includes(s)||r==="vorbis"&&o>=1&&o<=255&&s<=2e5||r==="flac"&&o>=1&&o<=8&&s<=655350||r==="ac3"&&o>=1&&o<=6&&it.includes(s)||r==="eac3"&&o>=1&&o<=16&&it.includes(s)}async init(){this.frame=new v.Frame,this.frame.alloc(),this.packet=new v.Packet,this.packet.alloc();let r=X[this.codec];p(r!==void 0);let i=v.Codec.findEncoder(r);if(!i)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=i,await this.createCodecContext()}async createCodecContext(){p(this.codecContext===null);let r=new v.CodecContext;r.allocContext3(this.avCodec);let i=v.AV_SAMPLE_FMT_FLTP;this.avCodec.sampleFormats&&!this.avCodec.sampleFormats.includes(v.AV_SAMPLE_FMT_FLTP)&&(i=this.avCodec.sampleFormats[0]),r.sampleRate=this.config.sampleRate,r.channelLayout=Q(this.config.numberOfChannels),r.codecType=v.AVMEDIA_TYPE_AUDIO,r.codecId=X[this.codec],r.sampleFormat=i,r.timeBase=new v.Rational(1,this.config.sampleRate),r.bitRate=BigInt(this.config.bitrate??Nt._toAudioBitrate(this.codec)??0),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let o=await r.open2();v.FFmpegError.throwIfError(o,"Open codec context"),this.codecContext=r}async encode(r){this.codecContext===null&&(await this.createCodecContext(),p(this.codecContext)),this.firstExpectedTimestamp??=r.timestamp,r._data instanceof Y?(this.frame.unref(),this.frame.ref(r._data.frame)):me(r,this.frame),this.frame.pts=BigInt(Math.round(r.timestamp*this.config.sampleRate)),this.frame.duration=BigInt(Math.round(r.duration*this.config.sampleRate)),this.frame.timeBase=new v.Rational(1,this.config.sampleRate);let i=`${this.frame.sampleRate}:${this.frame.channels}:${this.frame.format}`;if(this.inputParametersKey!==null&&this.inputParametersKey!==i)throw new Error("Input audio parameters changed. For this audio encoder, you cannot change the input audio parameters over time.");if(this.inputParametersKey=i,this.codecContext.frameSize>0||this.codecContext.sampleFormat!==this.frame.format||this.codecContext.sampleRate!==this.frame.sampleRate||this.codecContext.channels!==this.frame.channels){if(!this.resampler){this.resampler=new v.SoftwareResampleContext,this.resamplerInputSampleRate=this.frame.sampleRate;let a=Q(this.codecContext.channels),A=Q(this.frame.channels),u=this.resampler.allocSetOpts2(a,this.codecContext.sampleFormat,this.codecContext.sampleRate,A,this.frame.format,this.frame.sampleRate);v.FFmpegError.throwIfError(u,"allocSetOpts2");let d=this.resampler.init();v.FFmpegError.throwIfError(d,"init"),this.dstFrame=new v.Frame,this.dstFrame.alloc(),this.dstFrame.channelLayout=a,this.dstFrame.sampleRate=this.codecContext.sampleRate,this.dstFrame.format=this.codecContext.sampleFormat,this.dstFrame.nbSamples=this.codecContext.frameSize||we,this.dstFrame.duration=BigInt(this.dstFrame.nbSamples),this.dstFrame.allocBuffer(),this.nextResamplerPts=this.frame.pts}let s=this.frame.data;if(!s)throw new DOMException("Frame has no data","EncodingError");await this.resampler.convert(null,0,s,this.frame.nbSamples),await this.pullResampledFrames()}else await this.sendFrameAndReceivePackets(this.frame)}async pullResampledFrames(){p(this.codecContext),p(this.resampler),p(this.dstFrame),p(this.nextResamplerPts!==null);let r=this.codecContext.frameSize||we;for(;!(this.resampler.getOutSamples(0)<r);)await this.resampler.convert(this.dstFrame.data,r,null,0),this.dstFrame.pts=this.nextResamplerPts,await this.sendFrameAndReceivePackets(this.dstFrame),this.nextResamplerPts+=BigInt(r)}async sendFrameAndReceivePackets(r){p(this.codecContext);let i=await this.codecContext.sendFrame(r);for(v.FFmpegError.throwIfError(i,"Send frame");;){let o=await this.codecContext.receivePacket(this.packet);if(o===v.AVERROR_EAGAIN||o===v.AVERROR_EOF)break;this.receivePacket(o)}}receivePacket(r){if(p(this.codecContext),p(this.firstExpectedTimestamp!==null),v.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let i=Number(this.packet.pts)/this.codecContext.sampleRate,o=Number(this.packet.duration)/this.codecContext.sampleRate,s=this.packet.data,a;if(this.packetEmitted)a={};else{this.outputTimestampOffset=Math.max(this.firstExpectedTimestamp-i,0);let u=this.config.codec,d=this.codecContext.extraData?M(this.codecContext.extraData):void 0;if(this.codec==="aac"){if(!d)throw new Error("Extradata expected for AAC.");if(this.config.aac?.format==="adts"){let h=We(d);this.adtsHeaderTemplate=Ge(h),d=void 0}}else if(this.codec==="opus"){if(!d)throw new Error("Extradata expected for Opus.")}else if(this.codec==="vorbis"){if(!d)throw new Error("Extradata expected for Vorbis.")}else if(this.codec==="flac"){if(!d)throw new Error("Extradata expected for FLAC.");d=new Uint8Array([102,76,97,67,128,0,0,d.byteLength,...d])}a={decoderConfig:{codec:u,sampleRate:this.codecContext.sampleRate,numberOfChannels:this.codecContext.channels,description:d}}}if(this.adtsHeaderTemplate){let u=s.byteLength+this.adtsHeaderTemplate.header.byteLength;this.adtsHeaderTemplate.bitstream.pos=30,this.adtsHeaderTemplate.bitstream.writeBits(13,u);let d=new Uint8Array(this.adtsHeaderTemplate.header.byteLength+s.byteLength);d.set(this.adtsHeaderTemplate.header,0),d.set(s,this.adtsHeaderTemplate.header.byteLength),s=d}i+=this.outputTimestampOffset;let A=new Mt(s,"key",i,o);this.packetEmitted=!0,this.onPacket(A,a)}async flush(){if(this.codecContext){e:if(this.resampler){p(this.resamplerInputSampleRate!==null);let r=this.resampler.getOutSamples(0);if(r===0)break e;let i=this.codecContext.frameSize||we;p(r<i);let o=Math.ceil((i-r)/this.codecContext.sampleRate*this.resamplerInputSampleRate);this.resampler.injectSilence(o),await this.pullResampledFrames()}await this.sendFrameAndReceivePackets(null),this.codecContext.freeContext(),this.codecContext=null,this.packetEmitted=!1,this.firstExpectedTimestamp=null,this.outputTimestampOffset=0,this.adtsHeaderTemplate=null,this.resampler?.free(),this.resampler=null,this.inputParametersKey=null,this.resamplerInputSampleRate=null,this.nextResamplerPts=null,this.dstFrame?.free(),this.dstFrame=null}}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free(),this.dstFrame?.free(),this.resampler?.free()}};var ct=Symbol.for("@mediabunny/server loaded");globalThis[ct]&&console.error(`[WARNING]
|
|
9
|
+
@mediabunny/server was loaded twice. This will likely cause the package not to work correctly. Check if multiple dependencies are importing different versions of @mediabunny/server, or if something is being bundled incorrectly.`);globalThis[ct]=!0;var at=!1,G={},yi=(t={})=>{if(typeof t!="object"||!t)throw new TypeError("options must be an object.");if(t.hardwareContext!=null&&!(t.hardwareContext instanceof z.HardwareContext||typeof t.hardwareContext=="function"))throw new TypeError("options.hardwareContext, when provided, must be a NodeAv.HardwareContext, a function, or null.");at||(at=!0,G=t,z.Log.setLevel(z.AV_LOG_ERROR),nt(le),ot(ue),nt(fe),ot(pe),Ot(ze))},Si=async(t,e)=>{if(!(t instanceof st)&&!(t instanceof Dt))throw new TypeError("sample must be a VideoSample or an AudioSample.");if(!(e instanceof z.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(t instanceof st){if(t._data instanceof H)e.unref(),e.ref(t._data.frame);else{if(t.format===null)throw new Error("Cannot convert foreign VideoSample with unknown (null) format.");await re(t,e,null)}e.pts=BigInt(t.microsecondTimestamp),e.duration=BigInt(t.microsecondDuration),e.timeBase=new z.Rational(1,1e6)}else t._data instanceof Y?(e.unref(),e.ref(t._data.frame)):me(t,e),e.timeBase=new z.Rational(1,t.sampleRate),e.pts=BigInt(Math.round(t.timestamp*t.sampleRate)),e.duration=BigInt(t.numberOfFrames)};export{Y as AvFrameAudioSampleResource,H as AvFrameVideoSampleResource,G as _serverOptions,yi as registerMediabunnyServer,Si as toAvFrame};
|
|
@@ -7,7 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
// packages/server/src/index.ts
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
AudioSample as AudioSample4,
|
|
12
|
+
registerDecoder,
|
|
13
|
+
registerEncoder,
|
|
14
|
+
registerVideoSampleTransformer,
|
|
15
|
+
VideoSample as VideoSample4
|
|
16
|
+
} from "mediabunny";
|
|
11
17
|
import * as NodeAv8 from "node-av";
|
|
12
18
|
|
|
13
19
|
// packages/server/src/video-decoder.ts
|
|
@@ -32,13 +38,28 @@ var CODEC_TO_CODEC_ID = {
|
|
|
32
38
|
};
|
|
33
39
|
var cachedHardwareContext = void 0;
|
|
34
40
|
var getHardwareContext = () => {
|
|
41
|
+
if (_serverOptions.hardwareContext !== void 0 && typeof _serverOptions.hardwareContext !== "function") {
|
|
42
|
+
return _serverOptions.hardwareContext;
|
|
43
|
+
}
|
|
35
44
|
if (cachedHardwareContext === void 0) {
|
|
36
45
|
cachedHardwareContext = NodeAv.HardwareContext.auto();
|
|
37
46
|
}
|
|
38
47
|
return cachedHardwareContext;
|
|
39
48
|
};
|
|
49
|
+
var validateHwContext = (hw) => {
|
|
50
|
+
if (hw !== null && !(hw instanceof NodeAv.HardwareContext)) {
|
|
51
|
+
throw new TypeError(
|
|
52
|
+
"When serverOptions.hardwareContext is a function, it must return or resolve to a NodeAv.HardwareContext or null."
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
40
56
|
var hardwareDecoderCodecCache = /* @__PURE__ */ new Map();
|
|
41
|
-
var getHardwareDecoderCodec = (codecId) => {
|
|
57
|
+
var getHardwareDecoderCodec = async (codecId) => {
|
|
58
|
+
if (typeof _serverOptions.hardwareContext === "function") {
|
|
59
|
+
const hw = await _serverOptions.hardwareContext(codecId);
|
|
60
|
+
validateHwContext(hw);
|
|
61
|
+
return hw?.getDecoderCodec(codecId) ?? null;
|
|
62
|
+
}
|
|
42
63
|
if (!hardwareDecoderCodecCache.has(codecId)) {
|
|
43
64
|
const hw = getHardwareContext();
|
|
44
65
|
hardwareDecoderCodecCache.set(codecId, hw?.getDecoderCodec(codecId) ?? null);
|
|
@@ -46,7 +67,12 @@ var getHardwareDecoderCodec = (codecId) => {
|
|
|
46
67
|
return hardwareDecoderCodecCache.get(codecId);
|
|
47
68
|
};
|
|
48
69
|
var hardwareEncoderCodecCache = /* @__PURE__ */ new Map();
|
|
49
|
-
var getHardwareEncoderCodec = (codecId) => {
|
|
70
|
+
var getHardwareEncoderCodec = async (codecId) => {
|
|
71
|
+
if (typeof _serverOptions.hardwareContext === "function") {
|
|
72
|
+
const hw = await _serverOptions.hardwareContext(codecId);
|
|
73
|
+
validateHwContext(hw);
|
|
74
|
+
return hw?.getEncoderCodec(codecId) ?? null;
|
|
75
|
+
}
|
|
50
76
|
if (!hardwareEncoderCodecCache.has(codecId)) {
|
|
51
77
|
const hw = getHardwareContext();
|
|
52
78
|
hardwareEncoderCodecCache.set(codecId, hw?.getEncoderCodec(codecId) ?? null);
|
|
@@ -470,6 +496,9 @@ var AvFrameVideoSampleResource = class _AvFrameVideoSampleResource extends Video
|
|
|
470
496
|
}
|
|
471
497
|
constructor(frame) {
|
|
472
498
|
super();
|
|
499
|
+
if (!(frame instanceof NodeAv2.Frame)) {
|
|
500
|
+
throw new TypeError("frame must be a NodeAv.Frame.");
|
|
501
|
+
}
|
|
473
502
|
if (frame.getMediaType() !== NodeAv2.AVMEDIA_TYPE_VIDEO) {
|
|
474
503
|
throw new Error("AvFrameVideoSampleResource must be initialized with a video frame.");
|
|
475
504
|
}
|
|
@@ -674,7 +703,7 @@ var NodeAvVideoDecoder = class extends CustomVideoDecoder {
|
|
|
674
703
|
) {
|
|
675
704
|
codec = NodeAv3.Codec.findDecoder(codecId);
|
|
676
705
|
} else {
|
|
677
|
-
codec = getHardwareDecoderCodec(codecId) ?? NodeAv3.Codec.findDecoder(codecId);
|
|
706
|
+
codec = await getHardwareDecoderCodec(codecId) ?? NodeAv3.Codec.findDecoder(codecId);
|
|
678
707
|
}
|
|
679
708
|
if (!codec) {
|
|
680
709
|
throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);
|
|
@@ -2494,7 +2523,7 @@ var NodeAvVideoEncoder = class extends CustomVideoEncoder {
|
|
|
2494
2523
|
} else if (this.config.hardwareAcceleration === "prefer-software") {
|
|
2495
2524
|
codec = NodeAv4.Codec.findEncoder(codecId);
|
|
2496
2525
|
} else {
|
|
2497
|
-
codec = getHardwareEncoderCodec(codecId) ?? NodeAv4.Codec.findEncoder(codecId);
|
|
2526
|
+
codec = await getHardwareEncoderCodec(codecId) ?? NodeAv4.Codec.findEncoder(codecId);
|
|
2498
2527
|
}
|
|
2499
2528
|
if (!codec) {
|
|
2500
2529
|
throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);
|
|
@@ -2884,6 +2913,9 @@ var AvFrameAudioSampleResource = class extends AudioSampleResource {
|
|
|
2884
2913
|
}
|
|
2885
2914
|
constructor(frame) {
|
|
2886
2915
|
super();
|
|
2916
|
+
if (!(frame instanceof NodeAv5.Frame)) {
|
|
2917
|
+
throw new TypeError("frame must be a NodeAv.Frame.");
|
|
2918
|
+
}
|
|
2887
2919
|
if (frame.getMediaType() !== NodeAv5.AVMEDIA_TYPE_AUDIO) {
|
|
2888
2920
|
throw new Error("AvFrameAudioSampleResource must be initialized with an audio frame.");
|
|
2889
2921
|
}
|
|
@@ -3299,11 +3331,21 @@ if (globalThis[SERVER_LOADED_SYMBOL]) {
|
|
|
3299
3331
|
}
|
|
3300
3332
|
globalThis[SERVER_LOADED_SYMBOL] = true;
|
|
3301
3333
|
var registered = false;
|
|
3302
|
-
var
|
|
3334
|
+
var _serverOptions = {};
|
|
3335
|
+
var registerMediabunnyServer = (options = {}) => {
|
|
3336
|
+
if (typeof options !== "object" || !options) {
|
|
3337
|
+
throw new TypeError("options must be an object.");
|
|
3338
|
+
}
|
|
3339
|
+
if (options.hardwareContext != null && !(options.hardwareContext instanceof NodeAv8.HardwareContext || typeof options.hardwareContext === "function")) {
|
|
3340
|
+
throw new TypeError(
|
|
3341
|
+
"options.hardwareContext, when provided, must be a NodeAv.HardwareContext, a function, or null."
|
|
3342
|
+
);
|
|
3343
|
+
}
|
|
3303
3344
|
if (registered) {
|
|
3304
3345
|
return;
|
|
3305
3346
|
}
|
|
3306
3347
|
registered = true;
|
|
3348
|
+
_serverOptions = options;
|
|
3307
3349
|
NodeAv8.Log.setLevel(NodeAv8.AV_LOG_ERROR);
|
|
3308
3350
|
registerDecoder(NodeAvVideoDecoder);
|
|
3309
3351
|
registerEncoder(NodeAvVideoEncoder);
|
|
@@ -3312,6 +3354,12 @@ var registerMediabunnyServer = () => {
|
|
|
3312
3354
|
registerVideoSampleTransformer(transformVideoSample);
|
|
3313
3355
|
};
|
|
3314
3356
|
var toAvFrame = async (sample, frame) => {
|
|
3357
|
+
if (!(sample instanceof VideoSample4) && !(sample instanceof AudioSample4)) {
|
|
3358
|
+
throw new TypeError("sample must be a VideoSample or an AudioSample.");
|
|
3359
|
+
}
|
|
3360
|
+
if (!(frame instanceof NodeAv8.Frame)) {
|
|
3361
|
+
throw new TypeError("frame must be a NodeAv.Frame.");
|
|
3362
|
+
}
|
|
3315
3363
|
if (sample instanceof VideoSample4) {
|
|
3316
3364
|
if (sample._data instanceof AvFrameVideoSampleResource) {
|
|
3317
3365
|
frame.unref();
|
|
@@ -3340,6 +3388,7 @@ var toAvFrame = async (sample, frame) => {
|
|
|
3340
3388
|
export {
|
|
3341
3389
|
AvFrameAudioSampleResource,
|
|
3342
3390
|
AvFrameVideoSampleResource,
|
|
3391
|
+
_serverOptions,
|
|
3343
3392
|
registerMediabunnyServer,
|
|
3344
3393
|
toAvFrame
|
|
3345
3394
|
};
|
|
@@ -72,6 +72,23 @@ export declare class AvFrameVideoSampleResource extends VideoSampleResource {
|
|
|
72
72
|
toRgbSample(init: SetRequired<VideoSampleInit, 'timestamp'>, colorSpace: PredefinedColorSpace): Promise<VideoSample>;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
/**
|
|
76
|
+
* Options for configuring Mediabunny's server-side polyfills.
|
|
77
|
+
* @group \@mediabunny/server
|
|
78
|
+
* @public
|
|
79
|
+
*/
|
|
80
|
+
export declare type MediabunnyServerOptions = {
|
|
81
|
+
/**
|
|
82
|
+
* The hardware context to use for hardware-accelerated decoding and encoding. When set to a
|
|
83
|
+
* `NodeAv.HardwareContext`, that context is used directly. When set to a function, the function is invoked (with
|
|
84
|
+
* no caching) every time a hardware decoder or encoder codec is resolved, receiving the codec ID and returning the
|
|
85
|
+
* context to use for it (or `null` for no hardware acceleration).
|
|
86
|
+
*
|
|
87
|
+
* When not set, a context is automatically detected on first use and then cached.
|
|
88
|
+
*/
|
|
89
|
+
hardwareContext?: NodeAv.HardwareContext | null | ((codecId: NodeAv.AVCodecID) => MaybePromise<NodeAv.HardwareContext | null>);
|
|
90
|
+
};
|
|
91
|
+
|
|
75
92
|
/**
|
|
76
93
|
* Registers video and audio decoders and encoders for all codecs, using FFmpeg's libavcodec under the hood.
|
|
77
94
|
* Additionally, a custom `VideoSample` transformer based on libavfilter is registered to enable resizing, rotation and
|
|
@@ -82,10 +99,12 @@ export declare class AvFrameVideoSampleResource extends VideoSampleResource {
|
|
|
82
99
|
* The decoders and encoders will automatically detect hardware acceleration support for each codec and platform and
|
|
83
100
|
* make use of it if applicable.
|
|
84
101
|
*
|
|
102
|
+
* You can pass optional {@link MediabunnyServerOptions} for additional configuration.
|
|
103
|
+
*
|
|
85
104
|
* @group \@mediabunny/server
|
|
86
105
|
* @public
|
|
87
106
|
*/
|
|
88
|
-
export declare const registerMediabunnyServer: () => void;
|
|
107
|
+
export declare const registerMediabunnyServer: (options?: MediabunnyServerOptions) => void;
|
|
89
108
|
|
|
90
109
|
/**
|
|
91
110
|
* Copies a `VideoSample` or `AudioSample` into the given NodeAV
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-sample.d.ts","sourceRoot":"","sources":["../../../src/audio-sample.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAIlC;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;IAIlE;;;OAGG;IACH,IAAI,KAAK,iBAMR;gBAEW,KAAK,EAAE,MAAM,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"audio-sample.d.ts","sourceRoot":"","sources":["../../../src/audio-sample.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAIlC;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;IAIlE;;;OAGG;IACH,IAAI,KAAK,iBAMR;gBAEW,KAAK,EAAE,MAAM,CAAC,KAAK;IAa/B,SAAS,IAAI,iBAAiB;IAU9B,aAAa,IAAI,MAAM;IAIvB,mBAAmB,IAAI,MAAM;IAI7B,iBAAiB,IAAI,MAAM;IAI3B,YAAY,IAAI,MAAM;IAItB,KAAK,IAAI,IAAI;IAKb,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;CAI5C;AAED,eAAO,MAAM,wBAAwB,GAAI,QAAQ,WAAW,EAAE,OAAO,MAAM,CAAC,KAAK,SAYhF,CAAC"}
|
|
@@ -70,6 +70,9 @@ class AvFrameAudioSampleResource extends mediabunny_1.AudioSampleResource {
|
|
|
70
70
|
}
|
|
71
71
|
constructor(frame) {
|
|
72
72
|
super();
|
|
73
|
+
if (!(frame instanceof NodeAv.Frame)) {
|
|
74
|
+
throw new TypeError('frame must be a NodeAv.Frame.');
|
|
75
|
+
}
|
|
73
76
|
if (frame.getMediaType() !== NodeAv.AVMEDIA_TYPE_AUDIO) {
|
|
74
77
|
throw new Error('AvFrameAudioSampleResource must be initialized with an audio frame.');
|
|
75
78
|
}
|
|
@@ -5,8 +5,24 @@
|
|
|
5
5
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
6
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
7
7
|
*/
|
|
8
|
-
import { AudioSample, VideoSample } from 'mediabunny';
|
|
8
|
+
import { AudioSample, MaybePromise, VideoSample } from 'mediabunny';
|
|
9
9
|
import * as NodeAv from 'node-av';
|
|
10
|
+
/**
|
|
11
|
+
* Options for configuring Mediabunny's server-side polyfills.
|
|
12
|
+
* @group \@mediabunny/server
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
type MediabunnyServerOptions = {
|
|
16
|
+
/**
|
|
17
|
+
* The hardware context to use for hardware-accelerated decoding and encoding. When set to a
|
|
18
|
+
* `NodeAv.HardwareContext`, that context is used directly. When set to a function, the function is invoked (with
|
|
19
|
+
* no caching) every time a hardware decoder or encoder codec is resolved, receiving the codec ID and returning the
|
|
20
|
+
* context to use for it (or `null` for no hardware acceleration).
|
|
21
|
+
*
|
|
22
|
+
* When not set, a context is automatically detected on first use and then cached.
|
|
23
|
+
*/
|
|
24
|
+
hardwareContext?: NodeAv.HardwareContext | null | ((codecId: NodeAv.AVCodecID) => MaybePromise<NodeAv.HardwareContext | null>);
|
|
25
|
+
};
|
|
10
26
|
/**
|
|
11
27
|
* Registers video and audio decoders and encoders for all codecs, using FFmpeg's libavcodec under the hood.
|
|
12
28
|
* Additionally, a custom `VideoSample` transformer based on libavfilter is registered to enable resizing, rotation and
|
|
@@ -17,10 +33,13 @@ import * as NodeAv from 'node-av';
|
|
|
17
33
|
* The decoders and encoders will automatically detect hardware acceleration support for each codec and platform and
|
|
18
34
|
* make use of it if applicable.
|
|
19
35
|
*
|
|
36
|
+
* You can pass optional {@link MediabunnyServerOptions} for additional configuration.
|
|
37
|
+
*
|
|
20
38
|
* @group \@mediabunny/server
|
|
21
39
|
* @public
|
|
22
40
|
*/
|
|
23
|
-
export declare const registerMediabunnyServer: () => void;
|
|
41
|
+
export declare const registerMediabunnyServer: (options?: MediabunnyServerOptions) => void;
|
|
42
|
+
export type { MediabunnyServerOptions };
|
|
24
43
|
export { AvFrameVideoSampleResource } from './video-sample';
|
|
25
44
|
export { AvFrameAudioSampleResource } from './audio-sample';
|
|
26
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,WAAW,EACX,YAAY,EAIZ,WAAW,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAqBlC;;;;GAIG;AACH,KAAK,uBAAuB,GAAG;IAC9B;;;;;;;OAOG;IACH,eAAe,CAAC,EACb,MAAM,CAAC,eAAe,GACtB,IAAI,GACJ,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,KAAK,YAAY,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;CAChF,CAAC;AAKF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,GAAI,UAAS,uBAA4B,SAiC7E,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC;AAExC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,GAAU,QAAQ,WAAW,GAAG,WAAW,EAAE,OAAO,MAAM,CAAC,KAAK,kBAqCrF,CAAC"}
|
|
@@ -40,7 +40,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
40
40
|
};
|
|
41
41
|
})();
|
|
42
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
-
exports.toAvFrame = exports.AvFrameAudioSampleResource = exports.AvFrameVideoSampleResource = exports.registerMediabunnyServer = void 0;
|
|
43
|
+
exports.toAvFrame = exports.AvFrameAudioSampleResource = exports.AvFrameVideoSampleResource = exports.registerMediabunnyServer = exports._serverOptions = void 0;
|
|
44
44
|
const mediabunny_1 = require("mediabunny");
|
|
45
45
|
const NodeAv = __importStar(require("node-av"));
|
|
46
46
|
const video_decoder_1 = require("./video-decoder");
|
|
@@ -58,6 +58,8 @@ if (globalThis[SERVER_LOADED_SYMBOL]) {
|
|
|
58
58
|
}
|
|
59
59
|
globalThis[SERVER_LOADED_SYMBOL] = true;
|
|
60
60
|
let registered = false;
|
|
61
|
+
/** @internal */
|
|
62
|
+
exports._serverOptions = {};
|
|
61
63
|
/**
|
|
62
64
|
* Registers video and audio decoders and encoders for all codecs, using FFmpeg's libavcodec under the hood.
|
|
63
65
|
* Additionally, a custom `VideoSample` transformer based on libavfilter is registered to enable resizing, rotation and
|
|
@@ -68,14 +70,24 @@ let registered = false;
|
|
|
68
70
|
* The decoders and encoders will automatically detect hardware acceleration support for each codec and platform and
|
|
69
71
|
* make use of it if applicable.
|
|
70
72
|
*
|
|
73
|
+
* You can pass optional {@link MediabunnyServerOptions} for additional configuration.
|
|
74
|
+
*
|
|
71
75
|
* @group \@mediabunny/server
|
|
72
76
|
* @public
|
|
73
77
|
*/
|
|
74
|
-
const registerMediabunnyServer = () => {
|
|
78
|
+
const registerMediabunnyServer = (options = {}) => {
|
|
79
|
+
if (typeof options !== 'object' || !options) {
|
|
80
|
+
throw new TypeError('options must be an object.');
|
|
81
|
+
}
|
|
82
|
+
if (options.hardwareContext != null
|
|
83
|
+
&& !(options.hardwareContext instanceof NodeAv.HardwareContext || typeof options.hardwareContext === 'function')) {
|
|
84
|
+
throw new TypeError('options.hardwareContext, when provided, must be a NodeAv.HardwareContext, a function, or null.');
|
|
85
|
+
}
|
|
75
86
|
if (registered) {
|
|
76
87
|
return;
|
|
77
88
|
}
|
|
78
89
|
registered = true;
|
|
90
|
+
exports._serverOptions = options;
|
|
79
91
|
NodeAv.Log.setLevel(NodeAv.AV_LOG_ERROR);
|
|
80
92
|
// Video
|
|
81
93
|
(0, mediabunny_1.registerDecoder)(video_decoder_1.NodeAvVideoDecoder);
|
|
@@ -103,6 +115,12 @@ Object.defineProperty(exports, "AvFrameAudioSampleResource", { enumerable: true,
|
|
|
103
115
|
* @public
|
|
104
116
|
*/
|
|
105
117
|
const toAvFrame = async (sample, frame) => {
|
|
118
|
+
if (!(sample instanceof mediabunny_1.VideoSample) && !(sample instanceof mediabunny_1.AudioSample)) {
|
|
119
|
+
throw new TypeError('sample must be a VideoSample or an AudioSample.');
|
|
120
|
+
}
|
|
121
|
+
if (!(frame instanceof NodeAv.Frame)) {
|
|
122
|
+
throw new TypeError('frame must be a NodeAv.Frame.');
|
|
123
|
+
}
|
|
106
124
|
if (sample instanceof mediabunny_1.VideoSample) {
|
|
107
125
|
if (sample._data instanceof video_sample_1.AvFrameVideoSampleResource) {
|
|
108
126
|
// We're overriding the frame, so release whatever it referenced before, otherwise av_frame_ref leaks it
|
|
@@ -9,8 +9,8 @@ import { VideoSamplePixelFormat, MediaCodec } from 'mediabunny';
|
|
|
9
9
|
import * as NodeAv from 'node-av';
|
|
10
10
|
export declare const CODEC_TO_CODEC_ID: Partial<Record<MediaCodec, NodeAv.AVCodecID>>;
|
|
11
11
|
export declare const getHardwareContext: () => NodeAv.HardwareContext | null;
|
|
12
|
-
export declare const getHardwareDecoderCodec: (codecId: NodeAv.AVCodecID) => NodeAv.Codec | null
|
|
13
|
-
export declare const getHardwareEncoderCodec: (codecId: NodeAv.AVCodecID) => NodeAv.Codec | null
|
|
12
|
+
export declare const getHardwareDecoderCodec: (codecId: NodeAv.AVCodecID) => Promise<NodeAv.Codec | null>;
|
|
13
|
+
export declare const getHardwareEncoderCodec: (codecId: NodeAv.AVCodecID) => Promise<NodeAv.Codec | null>;
|
|
14
14
|
export declare const mapColorPrimaries: (primaries: string) => NodeAv.AVColorPrimaries | null;
|
|
15
15
|
export declare const unmapColorPrimaries: (primaries: number) => "bt709" | "bt470bg" | "smpte170m" | "bt2020" | "smpte432" | null;
|
|
16
16
|
export declare const mapTransferCharacteristics: (transfer: string) => NodeAv.AVColorTransferCharacteristic | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../../src/misc.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../../src/misc.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAGlC,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAc3E,CAAC;AAGF,eAAO,MAAM,kBAAkB,QAAO,MAAM,CAAC,eAAe,GAAG,IAU9D,CAAC;AAYF,eAAO,MAAM,uBAAuB,GAAU,SAAS,MAAM,CAAC,SAAS,KAAG,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAapG,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAU,SAAS,MAAM,CAAC,SAAS,KAAG,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAapG,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,mCAUlD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM,qEAUpD,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,UAAU,MAAM,gDAW1D,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,UAAU,MAAM,4EAW5D,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,+BAUnD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,oEAUrD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,mBAAmB,MAAM,CAAC,aAAa,KAAG,sBAAsB,GAAG,IAqChG,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,aAAa,sBAAsB,yBA+BlE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,oBAAoB,MAAM,CAAC,cAAc,KAAG,iBAAiB,GAAG,IAanG,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,cAAc,iBAAiB,KAAG,MAAM,CAAC,cAa9E,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,MAAM,CAAC,aAS7D,CAAC"}
|