@mediabunny/server 1.53.1 → 1.55.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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{AudioSample as Gt,Logging as Xt,registerDecoder as ct,registerEncoder as lt,registerVideoSampleTransformer as Yt,VideoSample as dt}from"mediabunny";import*as q from"node-av";import{CustomVideoDecoder as ht,VideoSample as gt}from"mediabunny";import*as b from"node-av";import*as o from"node-av";var Y={avc:o.AV_CODEC_ID_H264,hevc:o.AV_CODEC_ID_HEVC,vp8:o.AV_CODEC_ID_VP8,vp9:o.AV_CODEC_ID_VP9,av1:o.AV_CODEC_ID_AV1,prores:o.AV_CODEC_ID_PRORES,aac:o.AV_CODEC_ID_AAC,opus:o.AV_CODEC_ID_OPUS,mp3:o.AV_CODEC_ID_MP3,vorbis:o.AV_CODEC_ID_VORBIS,flac:o.AV_CODEC_ID_FLAC,ac3:o.AV_CODEC_ID_AC3,eac3:o.AV_CODEC_ID_EAC3},be,Re=()=>X.hardwareContext!==void 0&&typeof X.hardwareContext!="function"?X.hardwareContext:(be===void 0&&(be=o.HardwareContext.auto()),be),Ve=t=>{if(t!==null&&!(t instanceof o.HardwareContext))throw new TypeError("When serverOptions.hardwareContext is a function, it must return or resolve to a NodeAv.HardwareContext or null.")},xe=new Map,Ne=async t=>{if(typeof X.hardwareContext=="function"){let e=await X.hardwareContext(t);return Ve(e),e?.getDecoderCodec(t)??null}if(!xe.has(t)){let e=Re();xe.set(t,e?.getDecoderCodec(t)??null)}return xe.get(t)},ve=new Map,Me=async t=>{if(typeof X.hardwareContext=="function"){let e=await X.hardwareContext(t);return Ve(e),e?.getEncoderCodec(t)??null}if(!ve.has(t)){let e=Re();ve.set(t,e?.getEncoderCodec(t)??null)}return ve.get(t)},ke=t=>{switch(t){case"bt709":return o.AVCOL_PRI_BT709;case"bt470bg":return o.AVCOL_PRI_BT470BG;case"smpte170m":return o.AVCOL_PRI_SMPTE170M;case"bt2020":return o.AVCOL_PRI_BT2020;case"smpte432":return o.AVCOL_PRI_SMPTE432}return null},ae=t=>{switch(t){case o.AVCOL_PRI_BT709:return"bt709";case o.AVCOL_PRI_BT470BG:return"bt470bg";case o.AVCOL_PRI_SMPTE170M:return"smpte170m";case o.AVCOL_PRI_BT2020:return"bt2020";case o.AVCOL_PRI_SMPTE432:return"smpte432"}return null},Ue=t=>{switch(t){case"bt709":return o.AVCOL_TRC_BT709;case"smpte170m":return o.AVCOL_TRC_SMPTE170M;case"iec61966-2-1":return o.AVCOL_TRC_IEC61966_2_1;case"linear":return o.AVCOL_TRC_LINEAR;case"pq":return o.AVCOL_TRC_SMPTE2084;case"hlg":return o.AVCOL_TRC_ARIB_STD_B67}return null},ce=t=>{switch(t){case o.AVCOL_TRC_BT709:return"bt709";case o.AVCOL_TRC_SMPTE170M:return"smpte170m";case o.AVCOL_TRC_IEC61966_2_1:return"iec61966-2-1";case o.AVCOL_TRC_LINEAR:return"linear";case o.AVCOL_TRC_SMPTE2084:return"pq";case o.AVCOL_TRC_ARIB_STD_B67:return"hlg"}return null},Oe=t=>{switch(t){case"rgb":return o.AVCOL_SPC_RGB;case"bt709":return o.AVCOL_SPC_BT709;case"bt470bg":return o.AVCOL_SPC_BT470BG;case"smpte170m":return o.AVCOL_SPC_SMPTE170M;case"bt2020-ncl":return o.AVCOL_SPC_BT2020_NCL}return null},le=t=>{switch(t){case o.AVCOL_SPC_RGB:return"rgb";case o.AVCOL_SPC_BT709:return"bt709";case o.AVCOL_SPC_BT470BG:return"bt470bg";case o.AVCOL_SPC_SMPTE170M:return"smpte170m";case o.AVCOL_SPC_BT2020_NCL:return"bt2020-ncl"}return null},Le=t=>{switch(t){case o.AV_PIX_FMT_YUV420P:return"I420";case o.AV_PIX_FMT_YUVJ420P:return"I420";case o.AV_PIX_FMT_YUV420P10LE:return"I420P10";case o.AV_PIX_FMT_YUV420P12LE:return"I420P12";case o.AV_PIX_FMT_YUVA420P:return"I420A";case o.AV_PIX_FMT_YUVA420P10LE:return"I420AP10";case o.AV_PIX_FMT_YUV422P:return"I422";case o.AV_PIX_FMT_YUVJ422P:return"I422";case o.AV_PIX_FMT_YUV422P10LE:return"I422P10";case o.AV_PIX_FMT_YUV422P12LE:return"I422P12";case o.AV_PIX_FMT_YUVA422P:return"I422A";case o.AV_PIX_FMT_YUVA422P10LE:return"I422AP10";case o.AV_PIX_FMT_YUVA422P12LE:return"I422AP12";case o.AV_PIX_FMT_YUV444P:return"I444";case o.AV_PIX_FMT_YUVJ444P:return"I444";case o.AV_PIX_FMT_YUV444P10LE:return"I444P10";case o.AV_PIX_FMT_YUV444P12LE:return"I444P12";case o.AV_PIX_FMT_YUVA444P:return"I444A";case o.AV_PIX_FMT_YUVA444P10LE:return"I444AP10";case o.AV_PIX_FMT_YUVA444P12LE:return"I444AP12";case o.AV_PIX_FMT_NV12:return"NV12";case o.AV_PIX_FMT_RGBA:return"RGBA";case o.AV_PIX_FMT_RGB0:return"RGBX";case o.AV_PIX_FMT_BGRA:return"BGRA";case o.AV_PIX_FMT_BGR0:return"BGRX";default:return null}},_e=t=>{switch(t){case"I420":return o.AV_PIX_FMT_YUV420P;case"I420P10":return o.AV_PIX_FMT_YUV420P10LE;case"I420P12":return o.AV_PIX_FMT_YUV420P12LE;case"I420A":return o.AV_PIX_FMT_YUVA420P;case"I420AP10":return o.AV_PIX_FMT_YUVA420P10LE;case"I422":return o.AV_PIX_FMT_YUV422P;case"I422P10":return o.AV_PIX_FMT_YUV422P10LE;case"I422P12":return o.AV_PIX_FMT_YUV422P12LE;case"I422A":return o.AV_PIX_FMT_YUVA422P;case"I422AP10":return o.AV_PIX_FMT_YUVA422P10LE;case"I422AP12":return o.AV_PIX_FMT_YUVA422P12LE;case"I444":return o.AV_PIX_FMT_YUV444P;case"I444P10":return o.AV_PIX_FMT_YUV444P10LE;case"I444P12":return o.AV_PIX_FMT_YUV444P12LE;case"I444A":return o.AV_PIX_FMT_YUVA444P;case"I444AP10":return o.AV_PIX_FMT_YUVA444P10LE;case"I444AP12":return o.AV_PIX_FMT_YUVA444P12LE;case"NV12":return o.AV_PIX_FMT_NV12;case"RGBA":return o.AV_PIX_FMT_RGBA;case"RGBX":return o.AV_PIX_FMT_RGB0;case"BGRA":return o.AV_PIX_FMT_BGRA;case"BGRX":return o.AV_PIX_FMT_BGR0;default:return o.AV_PIX_FMT_NONE}},De=t=>{switch(t){case o.AV_SAMPLE_FMT_U8:return"u8";case o.AV_SAMPLE_FMT_S16:return"s16";case o.AV_SAMPLE_FMT_S32:return"s32";case o.AV_SAMPLE_FMT_FLT:return"f32";case o.AV_SAMPLE_FMT_U8P:return"u8-planar";case o.AV_SAMPLE_FMT_S16P:return"s16-planar";case o.AV_SAMPLE_FMT_S32P:return"s32-planar";case o.AV_SAMPLE_FMT_FLTP:return"f32-planar";default:return null}},ze=t=>{switch(t){case"u8":return o.AV_SAMPLE_FMT_U8;case"s16":return o.AV_SAMPLE_FMT_S16;case"s32":return o.AV_SAMPLE_FMT_S32;case"f32":return o.AV_SAMPLE_FMT_FLT;case"u8-planar":return o.AV_SAMPLE_FMT_U8P;case"s16-planar":return o.AV_SAMPLE_FMT_S16P;case"s32-planar":return o.AV_SAMPLE_FMT_S32P;case"f32-planar":return o.AV_SAMPLE_FMT_FLTP;default:return o.AV_SAMPLE_FMT_NONE}},J=t=>{switch(t){case 1:return o.AV_CHANNEL_LAYOUT_MONO;case 2:return o.AV_CHANNEL_LAYOUT_STEREO;case 4:return o.AV_CHANNEL_LAYOUT_QUAD;case 6:return o.AV_CHANNEL_LAYOUT_5POINT1_BACK;case 8:return o.AV_CHANNEL_LAYOUT_7POINT1;default:return{nbChannels:t,order:o.AV_CHANNEL_ORDER_UNSPEC,mask:0n}}};var M=class M{constructor(){}static get level(){return M._level}static set level(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw new TypeError("Invalid log level. Use one of the values of the LogLevel enum.");M._level=e}static get _emitter(){return M._emitterInstance??=new de}static on(e,r,i){return M._emitter.on(e,r,i)}static _error(...e){M._emitter._emit("error",e),M._level>=1&&console.error(...e)}static _warn(...e){M._emitter._emit("warn",e),M._level>=2&&console.warn(...e)}static _info(...e){M._emitter._emit("info",e),M._level>=3&&console.info(...e)}};M._level=3,M._emitterInstance=null;var j=M;function m(t){if(!t)throw new Error("Assertion failed.")}var ee=t=>t&&t[t.length-1];var A=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)},G=t=>{let e=A(t);return(e&1)===0?-(e>>1):e+1>>1};var k=t=>t.constructor===Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),ye=t=>t.constructor===DataView?t:ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t);var He={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12};var qe={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18};var We={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9};var Ee=t=>[...t].map(e=>e.toString(16).padStart(2,"0")).join("");var Se=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 te=(t,e,r)=>{let i=0,n=t.length-1,s=-1;for(;i<=n;){let a=i+(n-i+1)/2|0;r(t[a])<=e?(s=a,i=a+1):n=a-1}return s};var we=t=>{throw new Error(`Unexpected value: ${t}`)};var Zt=1e6*(1+Number.EPSILON);var Ae=t=>{m(Number.isInteger(t.num)),m(Number.isInteger(t.den)),m(t.den!==0);let e=Math.abs(t.num),r=Math.abs(t.den);for(;r!==0;){let n=e%r;e=r,r=n}let i=e||1;return{num:t.num/i,den:t.den/i}};var de=class{constructor(){this._listeners=new Map}on(e,r,i){this._listeners.has(e)||this._listeners.set(e,new Set);let n={fn:r,once:i?.once??!1};return this._listeners.get(e).add(n),()=>{this._listeners.get(e)?.delete(n)}}_emit(...e){let[r,i]=e,n=this._listeners.get(r);if(n)for(let s of n){try{s.fn(i)}catch(a){console.error(a)}s.once&&n.delete(s)}}};import{VideoSampleResource as ft,VideoSampleColorSpace as mt,VideoSample as Ge}from"mediabunny";import*as p from"node-av";var pt=new Set([p.AV_PIX_FMT_YUVJ411P,p.AV_PIX_FMT_YUVJ420P,p.AV_PIX_FMT_YUVJ422P,p.AV_PIX_FMT_YUVJ440P,p.AV_PIX_FMT_YUVJ444P]),H=class t extends ft{get frame(){if(!this._frame)throw new Error("AvFrameVideoSampleResource has been closed.");return this._frame}constructor(e){if(super(),!(e instanceof p.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(e.getMediaType()!==p.AVMEDIA_TYPE_VIDEO)throw new Error("AvFrameVideoSampleResource must be initialized with a video frame.");this._frame=e}getFormat(){return Le(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 mt({primaries:ae(this.frame.colorPrimaries),transfer:ce(this.frame.colorTrc),matrix:le(this.frame.colorSpace),fullRange:this.frame.colorRange===p.AVCOL_RANGE_JPEG||pt.has(this.frame.format)?!0:this.frame.colorRange===p.AVCOL_RANGE_MPEG?!1:null})}close(){this.frame.free(),this._frame=null}getDataPlanes(){return m(this.frame.data),this.frame.data.map((e,r)=>({data:k(e),stride:this.frame.linesize[r]}))}async toRgbSample(e,r){let i=this.frame.width,n=this.frame.height,s=new p.SoftwareScaleContext,a=this.frame.format,l=_e("RGBA");s.getContext(i,n,a,i,n,l,p.SWS_BILINEAR);let f=new p.Frame;f.width=i,f.height=n,f.format=l,f.alloc(),f.allocBuffer();let c=this.frame;try{await s.scaleFrame(f,c)}finally{s.freeContext()}return f.sampleAspectRatio=c.sampleAspectRatio,new Ge(new t(f),e)}},oe=async(t,e,r)=>{m(t.format!==null),e.format=_e(t.format),e.width=t.codedWidth,e.height=t.codedHeight,e.sampleAspectRatio=new p.Rational(t.pixelAspectRatio.num,t.pixelAspectRatio.den),e.colorPrimaries=ke(t.colorSpace.primaries??"unknown")??p.AVCOL_PRI_UNSPECIFIED,e.colorSpace=Oe(t.colorSpace.matrix??"unknown")??p.AVCOL_SPC_UNSPECIFIED,e.colorTrc=Ue(t.colorSpace.transfer??"unknown")??p.AVCOL_TRC_UNSPECIFIED,e.colorRange=t.colorSpace.fullRange===!1?p.AVCOL_RANGE_MPEG:t.colorSpace.fullRange===!0?p.AVCOL_RANGE_JPEG:p.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},Xe=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 p.Frame,r.alloc(),i=!0,await oe(t,r,null)}let n=[];(t.squarePixelWidth!==t.codedWidth||t.squarePixelHeight!==t.codedHeight)&&(n.push(`scale=${t.squarePixelWidth}:${t.squarePixelHeight}`),n.push("setsar=1")),e.rotation===90?n.push("transpose=1"):e.rotation===180?n.push("transpose=1,transpose=1"):e.rotation===270&&n.push("transpose=2"),n.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"?n.push(`scale=${e.width}:${e.height}`):e.fit==="contain"?(n.push(`scale=${e.width}:${e.height}:force_original_aspect_ratio=decrease`),n.push(`pad=${e.width}:${e.height}:(ow-iw)/2:(oh-ih)/2:color=black@0`)):e.fit==="cover"&&(n.push(`scale=${e.width}:${e.height}:force_original_aspect_ratio=increase`),n.push(`crop=${e.width}:${e.height}`)),n.push("setsar=1");let s=new p.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}`,l=s.createFilter(p.Filter.getByName("buffer"),"src",a),f=s.createFilter(p.Filter.getByName("buffersink"),"sink");m(l&&f);let c=p.FilterInOut.createList([{name:"in",filterCtx:l,padIdx:0}]),d=p.FilterInOut.createList([{name:"out",filterCtx:f,padIdx:0}]),h=s.parsePtr(`[in]${n.join(",")}[out]`,d,c);p.FFmpegError.throwIfError(h,"FilterGraph.parsePtr");let S=await s.config();p.FFmpegError.throwIfError(S,"FilterGraph.config");let F=await l.buffersrcAddFrame(r);p.FFmpegError.throwIfError(F,"buffersrcAddFrame"),await l.buffersrcAddFrame(null);let g=new p.Frame;g.alloc();let x=await f.buffersinkGetFrame(g);return p.FFmpegError.throwIfError(x,"buffersinkGetFrame"),new Ge(new H(g),{timestamp:t.timestamp,duration:t.duration,rotation:0})}finally{s.free(),i&&r.free()}};var ue=class extends ht{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){m(this.codecContext===null);let i=Y[this.codec];m(i!==void 0);let n;if(this.codec==="vp9"&&r.sideData.alpha?n=b.Codec.findDecoderByName(b.FF_DECODER_LIBVPX_VP9)??b.Codec.findDecoder(i):this.config.hardwareAcceleration==="prefer-software"||this.codec==="av1"?n=b.Codec.findDecoder(i):n=await Ne(i)??b.Codec.findDecoder(i),!n)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let s=new b.CodecContext;s.allocContext3(n),this.pixelAspectRatio=Ae({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(k(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),m(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=te(this.preciseTimings,r.microsecondTimestamp,a=>a.microsecondTimestamp),n=i!==-1?this.preciseTimings[i]:null;n&&n.microsecondTimestamp===r.microsecondTimestamp?(n.timestamp!==r.timestamp&&(n.timestampIsValid=!1),n.duration!==r.duration&&(n.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,n=Number(this.frame.duration)/1e6,s=te(this.preciseTimings,Number(this.frame.pts),f=>f.microsecondTimestamp),a=s!==-1?this.preciseTimings[s]:null;a&&a.microsecondTimestamp===Number(this.frame.pts)&&(a.timestampIsValid&&(i=a.timestamp),a.durationIsValid&&(n=a.duration));let l=this.frame.clone();if(!l)throw new Error("Frame clone allocation failed.");this.onSample(new gt(new H(l),{timestamp:i,duration:n}))}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 Rt,Quality as Vt,EncodedPacket as Nt}from"mediabunny";import*as u from"node-av";var z=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),n=(r&1<<i)>>i;return this.pos++,n}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 n=this.pos;n<i;n++){let s=Math.floor(n/8),a=this.bytes[s],l=7-(n&7);a&=~(1<<l),a|=(r&1<<i-n-1)>>i-n-1<<l,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 Ye=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],Ct=[-1,1,2,3,4,5,6,8],Ke=t=>{if(!t||t.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=new z(t),r=e.readBits(5);r===31&&(r=32+e.readBits(6));let i=e.readBits(4),n=null;i===15?n=e.readBits(24):i<Ye.length&&(n=Ye[i]);let s=e.readBits(4),a=null;return s>=1&&s<=7&&(a=Ct[s]),{objectType:r,frequencyIndex:i,sampleRate:n,channelConfiguration:s,numberOfChannels:a}};var Qe=t=>{let e=new Uint8Array(7),r=new z(e),{objectType:i,frequencyIndex:n,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,n),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 xt=["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"],vt=["aac","opus","mp3","vorbis","flac","ac3","eac3"],yr=[...vt,...xt];var Ie=[{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 Z=[{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 Je=".01.01.01.01.00",$e=".0.110.01.01.01.0",_t=["ap4x","ap4h","apch","apcn","apcs","apco"];var re=t=>{let{codec:e,codecDescription:r,colorSpace:i,avcCodecInfo:n,hevcCodecInfo:s,vp9CodecInfo:a,av1CodecInfo:l,proresFormat:f}=t;if(e==="avc"){if(m(t.avcType!==null),n){let c=new Uint8Array([n.avcProfileIndication,n.profileCompatibility,n.avcLevelIndication]);return`avc${t.avcType}.${Ee(c)}`}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}.${Ee(r.subarray(1,4))}`}else if(e==="hevc"){let c,d,h,S,F,g;if(s)c=s.generalProfileSpace,d=s.generalProfileIdc,h=Se(s.generalProfileCompatibilityFlags),S=s.generalTierFlag,F=s.generalLevelIdc,g=[...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 C=ye(r),_=C.getUint8(1);c=_>>6&3,d=_&31,h=Se(C.getUint32(2)),S=_>>5&1,F=C.getUint8(12),g=[];for(let P=0;P<6;P++)g.push(C.getUint8(6+P))}let x="hev1.";for(x+=["","A","B","C"][c]+d,x+=".",x+=h.toString(16).toUpperCase(),x+=".",x+=S===0?"L":"H",x+=F;g.length>0&&g[g.length-1]===0;)g.pop();return g.length>0&&(x+=".",x+=g.map(C=>C.toString(16).toUpperCase()).join(".")),x}else{if(e==="vp8")return"vp8";if(e==="vp9"){if(!a){let P=t.width*t.height,w=ee(Z).level;for(let T of Z)if(P<=T.maxPictureSize){w=T.level;break}return`vp09.00.${w.toString().padStart(2,"0")}.08`}let c=a.profile.toString().padStart(2,"0"),d=a.level.toString().padStart(2,"0"),h=a.bitDepth.toString().padStart(2,"0"),S=a.chromaSubsampling.toString().padStart(2,"0"),F=a.colourPrimaries.toString().padStart(2,"0"),g=a.transferCharacteristics.toString().padStart(2,"0"),x=a.matrixCoefficients.toString().padStart(2,"0"),C=a.videoFullRangeFlag.toString().padStart(2,"0"),_=`vp09.${c}.${d}.${h}.${S}`;return _+=`.${F}.${g}.${x}.${C}`,_.endsWith(Je)&&(_=_.slice(0,-Je.length)),_}else if(e==="av1"){if(!l){let T=t.width*t.height,I=ee(Z).level;for(let y of Z)if(T<=y.maxPictureSize){I=y.level;break}return`av01.0.${I.toString().padStart(2,"0")}M.08`}let c=l.profile,d=l.level.toString().padStart(2,"0"),h=l.tier?"H":"M",S=l.bitDepth.toString().padStart(2,"0"),F=l.monochrome?"1":"0",g=100*l.chromaSubsamplingX+10*l.chromaSubsamplingY+1*(l.chromaSubsamplingX&&l.chromaSubsamplingY?l.chromaSamplePosition:0),x=i?.primaries?He[i.primaries]:1,C=i?.transfer?qe[i.transfer]:1,_=i?.matrix?We[i.matrix]:1,P=i?.fullRange?1:0,w=`av01.${c}.${d}${h}.${S}`;return w+=`.${F}.${g.toString().padStart(3,"0")}`,w+=`.${x.toString().padStart(2,"0")}`,w+=`.${C.toString().padStart(2,"0")}`,w+=`.${_.toString().padStart(2,"0")}`,w+=`.${P}`,w.endsWith($e)&&(w=w.slice(0,-$e.length)),w}else{if(e==="prores")return f??"apch";e!==null&&we(e)}}throw new TypeError(`Unhandled codec '${e}'.`)};var Er=["avc1","avc3","hev1","hvc1","vp8","vp09","av01",..._t];var me=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 n=0;if(e+3<t.length&&t[e+1]===0&&t[e+2]===0&&t[e+3]===1?n=4:t[e+1]===0&&t[e+2]===1&&(n=3),n===0){e++;continue}r!==-1&&e>r&&(yield{offset:r,length:e-r}),r=e+n,e=r}r!==-1&&r<t.length&&(yield{offset:r,length:t.length-r})};var Be=t=>t&31,Pe=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)},Dr=new Uint8Array([0,0,0,1]);var et=t=>{try{let e=[],r=[],i=[];for(let l of me(t)){let f=t.subarray(l.offset,l.offset+l.length),c=Be(f[0]);c===7?e.push(f):c===8?r.push(f):c===13&&i.push(f)}if(e.length===0||r.length===0)return null;let n=e[0],s=yt(n);m(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 j._error("Error building AVC Decoder Configuration Record:",e),null}},tt=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 n=0;n<i;n++)e.push(r[n])}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 n=0;n<i;n++)e.push(r[n])}if(t.avcProfileIndication===100||t.avcProfileIndication===110||t.avcProfileIndication===122||t.avcProfileIndication===144){m(t.chromaFormat!==null),m(t.bitDepthLumaMinus8!==null),m(t.bitDepthChromaMinus8!==null),m(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 n=0;n<i;n++)e.push(r[n])}}return new Uint8Array(e)};var rt={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}},yt=t=>{try{let e=new z(Pe(t));if(e.skipBits(1),e.skipBits(2),e.readBits(5)!==7)return null;let i=e.readAlignedByte(),n=e.readAlignedByte(),s=e.readAlignedByte();A(e);let a=1,l=0,f=0,c=0;if((i===100||i===110||i===122||i===244||i===44||i===83||i===86||i===118||i===128)&&(a=A(e),a===3&&(c=e.readBits(1)),l=A(e),f=A(e),e.skipBits(1),e.readBits(1))){for(let E=0;E<(a!==3?8:12);E++)if(e.readBits(1)){let Q=E<6?16:64,L=8,V=8;for(let D=0;D<Q;D++){if(V!==0){let $=G(e);V=(L+$+256)%256}L=V===0?L:V}}}A(e);let d=A(e);if(d===0)A(e);else if(d===1){e.skipBits(1),G(e),G(e);let U=A(e);for(let E=0;E<U;E++)G(e)}A(e),e.skipBits(1);let h=A(e),S=A(e),F=16*(h+1),g=16*(S+1),x=F,C=g,_=e.readBits(1);if(_||e.skipBits(1),e.skipBits(1),e.readBits(1)){let U=A(e),E=A(e),W=A(e),Q=A(e),L,V;if((c===0?a:0)===0)L=1,V=2-_;else{let $=a===3?1:2,ne=a===1?2:1;L=$,V=ne*(2-_)}x-=L*(U+E),C-=V*(W+Q)}let w=2,T=2,I=2,y=0,N={num:1,den:1},R=null,O=null;if(e.readBits(1)){if(e.readBits(1)){let ne=e.readBits(8);if(ne===255)N={num:e.readBits(16),den:e.readBits(16)};else{let Te=rt[ne];Te&&(N=Te)}}e.readBits(1)&&e.skipBits(1),e.readBits(1)&&(e.skipBits(3),y=e.readBits(1),e.readBits(1)&&(w=e.readBits(8),T=e.readBits(8),I=e.readBits(8))),e.readBits(1)&&(A(e),A(e)),e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.skipBits(1));let V=e.readBits(1);V&&je(e);let D=e.readBits(1);D&&je(e),(V||D)&&e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(1),A(e),A(e),A(e),A(e),R=A(e),O=A(e))}if(R===null){m(O===null);let U=n&16;if((i===44||i===86||i===100||i===110||i===122||i===244)&&U)R=0,O=0;else{let E=h+1,W=S+1,Q=(2-_)*W,L=Ie.find(D=>D.level>=s)??ee(Ie),V=Math.min(Math.floor(L.maxDpbMbs/(E*Q)),16);R=V,O=V}}return m(O!==null),{profileIdc:i,constraintFlags:n,levelIdc:s,frameMbsOnlyFlag:_,chromaFormatIdc:a,bitDepthLumaMinus8:l,bitDepthChromaMinus8:f,codedWidth:F,codedHeight:g,displayWidth:x,displayHeight:C,pixelAspectRatio:N,colourPrimaries:w,matrixCoefficients:I,transferCharacteristics:T,fullRangeFlag:y,numReorderFrames:R,maxDecFrameBuffering:O}}catch(e){return j._error("Error parsing AVC SPS:",e),null}},je=t=>{let e=A(t);t.skipBits(4),t.skipBits(4);for(let r=0;r<=e;r++)A(t),A(t),t.skipBits(1);t.skipBits(5),t.skipBits(5),t.skipBits(5),t.skipBits(5)};var fe=t=>t>>1&63,Et=t=>{try{let e=new z(Pe(t));e.skipBits(16),e.readBits(4);let r=e.readBits(3),i=e.readBits(1),{general_profile_space:n,general_tier_flag:s,general_profile_idc:a,general_profile_compatibility_flags:l,general_constraint_indicator_flags:f,general_level_idc:c}=St(e,r);A(e);let d=A(e),h=0;d===3&&(h=e.readBits(1));let S=A(e),F=A(e),g=S,x=F;if(e.readBits(1)){let E=A(e),W=A(e),Q=A(e),L=A(e),V=1,D=1,$=h===0?d:0;$===1?(V=2,D=2):$===2&&(V=2,D=1),g-=(E+W)*V,x-=(Q+L)*D}let C=A(e),_=A(e);A(e);let w=e.readBits(1)?0:r,T=0;for(let E=w;E<=r;E++)A(e),T=A(e),A(e);A(e),A(e),A(e),A(e),A(e),A(e),e.readBits(1)&&e.readBits(1)&&wt(e),e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(4),e.skipBits(4),A(e),A(e),e.skipBits(1));let I=A(e);if(It(e,I),e.readBits(1)){let E=A(e);for(let W=0;W<E;W++)A(e),e.skipBits(1)}e.skipBits(1),e.skipBits(1);let y=2,N=2,R=2,O=0,se=0,U={num:1,den:1};if(e.readBits(1)){let E=Pt(e,r);U=E.pixelAspectRatio,y=E.colourPrimaries,N=E.transferCharacteristics,R=E.matrixCoefficients,O=E.fullRangeFlag,se=E.minSpatialSegmentationIdc}return{displayWidth:g,displayHeight:x,pixelAspectRatio:U,colourPrimaries:y,transferCharacteristics:N,matrixCoefficients:R,fullRangeFlag:O,maxDecFrameBuffering:T+1,spsMaxSubLayersMinus1:r,spsTemporalIdNestingFlag:i,generalProfileSpace:n,generalTierFlag:s,generalProfileIdc:a,generalProfileCompatibilityFlags:l,generalConstraintIndicatorFlags:f,generalLevelIdc:c,chromaFormatIdc:d,bitDepthLumaMinus8:C,bitDepthChromaMinus8:_,minSpatialSegmentationIdc:se}}catch(e){return j._error("Error parsing HEVC SPS:",e),null}},it=t=>{try{let e=[],r=[],i=[],n=[];for(let c of me(t)){let d=t.subarray(c.offset,c.offset+c.length),h=fe(d[0]);h===32?e.push(d):h===33?r.push(d):h===34?i.push(d):(h===39||h===40)&&n.push(d)}if(r.length===0||i.length===0)return null;let s=Et(r[0]);if(!s)return null;let a=0;if(i.length>0){let c=i[0],d=new z(Pe(c));d.skipBits(16),A(d),A(d),d.skipBits(1),d.skipBits(1),d.skipBits(3),d.skipBits(1),d.skipBits(1),A(d),A(d),G(d),d.skipBits(1),d.skipBits(1),d.readBits(1)&&A(d),G(d),G(d),d.skipBits(1),d.skipBits(1),d.skipBits(1),d.skipBits(1);let h=d.readBits(1),S=d.readBits(1);!h&&!S?a=0:h&&!S?a=2:!h&&S?a=3:a=0}let l=[...e.length?[{arrayCompleteness:1,nalUnitType:32,nalUnits:e}]:[],...r.length?[{arrayCompleteness:1,nalUnitType:33,nalUnits:r}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:34,nalUnits:i}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:fe(n[0][0]),nalUnits:n}]:[]];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:l}}catch(e){return j._error("Error building HEVC Decoder Configuration Record:",e),null}},St=(t,e)=>{let r=t.readBits(2),i=t.readBits(1),n=t.readBits(5),s=0;for(let d=0;d<32;d++)s=s<<1|t.readBits(1);let a=new Uint8Array(6);for(let d=0;d<6;d++)a[d]=t.readBits(8);let l=t.readBits(8),f=[],c=[];for(let d=0;d<e;d++)f.push(t.readBits(1)),c.push(t.readBits(1));if(e>0)for(let d=e;d<8;d++)t.skipBits(2);for(let d=0;d<e;d++)f[d]&&t.skipBits(88),c[d]&&t.skipBits(8);return{general_profile_space:r,general_tier_flag:i,general_profile_idc:n,general_profile_compatibility_flags:s,general_constraint_indicator_flags:a,general_level_idc:l}},wt=t=>{for(let e=0;e<4;e++)for(let r=0;r<(e===3?2:6);r++)if(!t.readBits(1))A(t);else{let n=Math.min(64,1<<4+(e<<1));e>1&&G(t);for(let s=0;s<n;s++)G(t)}},It=(t,e)=>{let r=[];for(let i=0;i<e;i++)r[i]=Bt(t,i,e,r)},Bt=(t,e,r,i)=>{let n=0,s=0,a=0;if(e!==0&&(s=t.readBits(1)),s){if(e===r){let f=A(t);a=e-(f+1)}else a=e-1;t.readBits(1),A(t);let l=i[a]??0;for(let f=0;f<=l;f++)t.readBits(1)||t.readBits(1);n=i[a]}else{let l=A(t),f=A(t);for(let c=0;c<l;c++)A(t),t.readBits(1);for(let c=0;c<f;c++)A(t),t.readBits(1);n=l+f}return n},Pt=(t,e)=>{let r=2,i=2,n=2,s=0,a=0,l={num:1,den:1};if(t.readBits(1)){let f=t.readBits(8);if(f===255)l={num:t.readBits(16),den:t.readBits(16)};else{let c=rt[f];c&&(l=c)}}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),n=t.readBits(8))),t.readBits(1)&&(A(t),A(t)),t.readBits(1),t.readBits(1),t.readBits(1),t.readBits(1)&&(A(t),A(t),A(t),A(t)),t.readBits(1)&&(t.readBits(32),t.readBits(32),t.readBits(1)&&A(t),t.readBits(1)&&Ft(t,!0,e)),t.readBits(1)&&(t.readBits(1),t.readBits(1),t.readBits(1),a=A(t),A(t),A(t),A(t),A(t)),{pixelAspectRatio:l,colourPrimaries:r,transferCharacteristics:i,matrixCoefficients:n,fullRangeFlag:s,minSpatialSegmentationIdc:a}},Ft=(t,e,r)=>{let i=!1,n=!1,s=!1;e&&(i=t.readBits(1)===1,n=t.readBits(1)===1,(i||n)&&(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 l=t.readBits(1)===1,f=!0;l||(f=t.readBits(1)===1);let c=!1;f?A(t):c=t.readBits(1)===1;let d=1;c||(d=A(t)+1),i&&Ze(t,d,s),n&&Ze(t,d,s)}},Ze=(t,e,r)=>{for(let i=0;i<e;i++)A(t),A(t),r&&(A(t),A(t)),t.readBits(1)},nt=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 n=0;n<i.length;n++)e.push(i[n])}}return new Uint8Array(e)};var ot=t=>{let e=new z(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 c=8;s>=2&&(c=e.readBits(1)?12:10);let d=e.readBits(3),h=0,S=0;if(d!==7)if(S=e.readBits(1),s===1||s===3){let N=e.readBits(1),R=e.readBits(1);h=!N&&!R?3:N&&!R?2:1,e.skipBits(1)}else h=1;else h=3,S=1;let F=e.readBits(16),g=e.readBits(16),x=F+1,C=g+1,_=x*C,P=ee(Z).level;for(let y of Z)if(_<=y.maxPictureSize){P=y.level;break}return{profile:s,level:P,bitDepth:c,chromaSubsampling:h,videoFullRangeFlag:S,colourPrimaries:d===2?1:d===1?6:2,transferCharacteristics:d===2?1:d===1?6:2,matrixCoefficients:d===7?0:d===2?1:d===1?6:2}},Tt=function*(t){let e=new z(t),r=()=>{let i=0;for(let n=0;n<8;n++){let s=e.readAlignedByte();if(i|=(s&127)<<n*7,!(s&128))break;if(n===7&&s&128)return null}return i>=2**32-1?null:i};for(;e.getBitsLeft()>=8;){e.skipBits(1);let i=e.readBits(4),n=e.readBits(1),s=e.readBits(1);e.skipBits(1),n&&e.skipBits(8);let a;if(s){let l=r();if(l===null)return;a=l}else a=Math.floor(e.getBitsLeft()/8);m(e.pos%8===0),yield{type:i,data:t.subarray(e.pos/8,e.pos/8+a)},e.skipBits(a*8)}},st=t=>{for(let{type:e,data:r}of Tt(t)){if(e!==1)continue;let i=new z(r),n=i.readBits(3),s=i.readBits(1),a=i.readBits(1),l=0,f=0,c=0;if(a)l=i.readBits(5);else{if(i.readBits(1)&&(i.skipBits(32),i.skipBits(32),i.readBits(1)))return null;let y=i.readBits(1);y&&(c=i.readBits(5),i.skipBits(32),i.skipBits(5),i.skipBits(5));let N=i.readBits(5);for(let R=0;R<=N;R++){i.skipBits(12);let O=i.readBits(5);if(R===0&&(l=O),O>7){let U=i.readBits(1);R===0&&(f=U)}if(y&&i.readBits(1)){let E=c+1;i.skipBits(E),i.skipBits(E),i.skipBits(1)}i.readBits(1)&&i.skipBits(4)}}let d=i.readBits(4),h=i.readBits(4),S=d+1;i.skipBits(S);let F=h+1;i.skipBits(F);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 I=i.readBits(1);I&&(i.skipBits(1),i.skipBits(1));let y=i.readBits(1),N=0;y?N=2:N=i.readBits(1),N>0&&(i.readBits(1)||i.skipBits(1)),I&&i.skipBits(3)}i.skipBits(1),i.skipBits(1),i.skipBits(1);let x=i.readBits(1),C=8;n===2&&x?C=i.readBits(1)?12:10:n<=2&&(C=x?10:8);let _=0;n!==1&&(_=i.readBits(1));let P=1,w=1,T=0;return _||(n===0?(P=1,w=1):n===1?(P=0,w=0):C===12&&(P=i.readBits(1),P&&(w=i.readBits(1))),P&&w&&(T=i.readBits(2))),{profile:n,level:l,tier:f,bitDepth:C,monochrome:_,chromaSubsamplingX:P,chromaSubsamplingY:w,chromaSamplePosition:T}}return null};var zr=[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 Hr=new Uint8Array([5,4,65,67,45,51]),qr=new Uint8Array([5,4,69,65,67,51]);var Mt={apco:u.AV_PROFILE_PRORES_PROXY,apcs:u.AV_PROFILE_PRORES_LT,apcn:u.AV_PROFILE_PRORES_STANDARD,apch:u.AV_PROFILE_PRORES_HQ,ap4h:u.AV_PROFILE_PRORES_4444,ap4x:u.AV_PROFILE_PRORES_XQ},pe=class extends Rt{constructor(){super(...arguments);this.codecContext=null;this.scaler=null;this.dstFrame=null;this.lastBuffer=null;this.packetEmitted=!1;this.lastScalerKey=null;this.quantizer=null;this.preciseTimings=[]}static supports(r,i){return i.bitrateMode==="quantizer"?r==="avc"||r==="hevc"||r==="vp9"||r==="av1":r==="avc"||r==="hevc"||r==="vp8"||r==="vp9"||r==="av1"||r==="prores"}async init(){this.frame=new u.Frame,this.frame.alloc(),this.frame.timeBase=new u.Rational(1,1e6),this.packet=new u.Packet,this.packet.alloc();let r=Y[this.codec];m(r!==void 0);let i=()=>{if(this.codec==="prores"){let s=u.Codec.findEncoderByName(u.FF_ENCODER_PRORES_KS);if(s)return s}return u.Codec.findEncoder(r)},n=null;if(this.codec==="vp9"&&this.config.alpha==="keep")n=u.Codec.findEncoderByName(u.FF_ENCODER_LIBVPX_VP9)??u.Codec.findEncoder(r);else if(this.config.hardwareAcceleration==="prefer-software")n=i();else{let s=await Me(r);s&&this.config.bitrateMode==="quantizer"&&!s.name?.endsWith("_nvenc")&&(s=null),n=s??i()}if(!n)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=n,this.config.bitrateMode!=="quantizer"&&await this.createCodecContext()}async createCodecContext(){m(this.codecContext===null);let r=new u.CodecContext;r.allocContext3(this.avCodec);let i=u.AV_PIX_FMT_YUV420P;this.avCodec.pixelFormats&&(this.avCodec.pixelFormats.includes(u.AV_PIX_FMT_YUV420P)||(i=this.avCodec.pixelFormats[0]),this.config.alpha==="keep"&&(this.avCodec.pixelFormats.includes(u.AV_PIX_FMT_YUVA420P)?i=u.AV_PIX_FMT_YUVA420P:i=u.avcodecFindBestPixFmtOfList(this.avCodec.pixelFormats,u.AV_PIX_FMT_YUVA444P12LE)));let n=Ae({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 u.Rational(1,1e6),r.gopSize=60,r.framerate=new u.Rational(Math.round(this.config.framerate??0)||30,1),r.bitRate=this.config.bitrateMode==="quantizer"?0n:BigInt(this.config.bitrate??new Vt("medium")._toVideoBitrate(this.codec,this.config.width,this.config.height)),r.sampleAspectRatio=new u.Rational(n.num,n.den),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let s=this.config.latencyMode==="realtime";if(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")):(this.avCodec.name==="h264_nvenc"||this.avCodec.name==="hevc_nvenc")&&r.setOption("forced-idr","1"),this.config.bitrateMode==="quantizer"){m(this.quantizer!==null);let l;if(this.avCodec.name==="libaom-av1"||this.avCodec.name==="libsvtav1"?l=Math.round(this.quantizer/4):l=this.quantizer,this.avCodec.name==="libx264"||this.avCodec.name==="libx265")r.setOption("qp",String(l));else if(this.avCodec.name==="libvpx-vp9"||this.avCodec.name==="libaom-av1")r.setOption("crf",String(l));else if(this.avCodec.name==="libsvtav1")r.setOption("qp",String(l));else if(this.avCodec.name==="librav1e")r.setOption("qp",String(l));else if(this.avCodec.name?.endsWith("_nvenc"))r.setOption("rc","constqp"),r.setOption("qp",String(l));else throw new Error(`Encoder '${this.avCodec.name}' cannot be used for quantizer-based encoding.`);r.qMin=l,r.qMax=l}if(this.codec==="prores"){let l=Mt[this.config.codec];m(l!==void 0),r.setOption("profile",String(l))}let a=await r.open2();u.FFmpegError.throwIfError(a,"Open codec context"),this.codecContext=r}async encode(r,i){if(this.config.bitrateMode==="quantizer"){let c;if(this.codec==="avc"?c=i.avc?.quantizer:this.codec==="hevc"?c=i.hevc?.quantizer:this.codec==="vp9"?c=i.vp9?.quantizer:c=i.av1?.quantizer,m(c!=null),this.codecContext!==null&&c!==this.quantizer){let d=await this.codecContext.sendFrame(null);for(u.FFmpegError.throwIfError(d,"Send frame");;){let h=await this.codecContext.receivePacket(this.packet);if(h===u.AVERROR_EAGAIN||h===u.AVERROR_EOF)break;this.receivePacket(h)}this.codecContext.freeContext(),this.codecContext=null}this.quantizer=c}if(this.codecContext===null&&await this.createCodecContext(),m(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 oe(r,this.frame,this.lastBuffer)}let n=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 u.SoftwareScaleContext);let c=`${this.frame.width}x${this.frame.height}:${this.frame.format}`;if(c!==this.lastScalerKey){this.scaler.getContext(this.frame.width,this.frame.height,this.frame.format,this.codecContext.width,this.codecContext.height,this.codecContext.pixelFormat,u.SWS_FAST_BILINEAR),this.lastScalerKey=c;let h=this.scaler.initContext();u.FFmpegError.throwIfError(h,"initContext")}this.dstFrame||(this.dstFrame=new u.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),n=this.dstFrame}n.pts=BigInt(r.microsecondTimestamp),n.duration=BigInt(r.microsecondDuration),n.timeBase=new u.Rational(1,1e6),n.pictType=i?.keyFrame?u.AV_PICTURE_TYPE_I:u.AV_PICTURE_TYPE_NONE,n.keyFrame=i?.keyFrame?1:0;let a=te(this.preciseTimings,r.microsecondTimestamp,c=>c.microsecondTimestamp),l=a!==-1?this.preciseTimings[a]:null;l&&l.microsecondTimestamp===r.microsecondTimestamp?(l.timestamp!==r.timestamp&&(l.timestampIsValid=!1),l.duration!==r.duration&&(l.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 f=await this.codecContext.sendFrame(n);for(u.FFmpegError.throwIfError(f,"Send frame");;){let c=await this.codecContext.receivePacket(this.packet);if(c===u.AVERROR_EAGAIN||c===u.AVERROR_EOF)break;this.receivePacket(c)}}receivePacket(r){if(m(this.codecContext),u.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let i=k(this.packet.data),n=Number(this.packet.pts)/1e6,s=Number(this.packet.duration)/1e6,a=te(this.preciseTimings,Number(this.packet.pts),g=>g.microsecondTimestamp),l=a!==-1?this.preciseTimings[a]:null;l&&l.microsecondTimestamp===Number(this.packet.pts)&&(l.timestampIsValid&&(n=l.timestamp),l.durationIsValid&&(s=l.duration));let f={},c=null,d=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=et(this.packet.data);if(!C)throw new Error("Invalid AVC data, could not extract decoder configuration record.");x=tt(C)}else{let C=it(this.packet.data);if(!C)throw new Error("Invalid HEVC data, could not extract decoder configuration record.");x=nt(C)}c=re({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,proresFormat:null}),g||(d=x)}if(!g){let C=[];for(let I of me(i))if(this.codec==="avc"){let y=Be(i[I.offset]);y!==7&&y!==8&&y!==13&&C.push(I)}else{let y=fe(i[I.offset]);y!==33&&y!==34&&y!==32&&C.push(I)}let _=0;for(let I of C)_+=4+I.length;let P=new Uint8Array(_),w=new DataView(P.buffer),T=0;for(let I of C){let y=I.length;w.setUint32(T,y,!1),T+=4,P.set(i.subarray(I.offset,I.offset+I.length),T),T+=I.length}i=P}}else if(this.codec==="vp8")this.packetEmitted||(c=re({width:this.config.width,height:this.config.height,codec:"vp8",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null,proresFormat:null}));else if(this.codec==="vp9"){if(!this.packetEmitted){let g=ot(i);c=re({width:this.config.width,height:this.config.height,codec:"vp9",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:g,av1CodecInfo:null,proresFormat:null})}}else if(this.codec==="av1"){if(!this.packetEmitted){let g=st(i);c=re({width:this.config.width,height:this.config.height,codec:"av1",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:g,proresFormat:null})}}else if(this.codec==="prores")this.packetEmitted||(c=re({width:this.config.width,height:this.config.height,codec:"prores",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null,proresFormat:this.config.codec}));else throw new Error("Unreachable.");let h={},S=this.packet.getSideData(u.AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL);S&&(h.alpha=k(S).subarray(8));let F=new Nt(i,this.packet.isKeyframe?"key":"delta",n,s,void 0,void 0,h);c!==null&&(f.decoderConfig={codec:c,codedWidth:this.codecContext.width,codedHeight:this.codecContext.height,displayAspectWidth:this.config.displayWidth??this.codecContext.width,displayAspectHeight:this.config.displayHeight??this.codecContext.height,description:d??void 0,colorSpace:{primaries:ae(this.codecContext.colorPrimaries),matrix:le(this.codecContext.colorSpace),transfer:ce(this.codecContext.colorTrc),fullRange:this.codecContext.colorRange===u.AVCOL_RANGE_JPEG?!0:this.codecContext.colorRange===u.AVCOL_RANGE_MPEG?!1:void 0}}),this.packetEmitted=!0,this.onPacket(F,f)}async flush(){if(this.codecContext){let r=await this.codecContext.sendFrame(null);for(u.FFmpegError.throwIfError(r,"Send frame");;){let i=await this.codecContext.receivePacket(this.packet);if(i===u.AVERROR_EAGAIN||i===u.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 Ut,CustomAudioDecoder as Ot}from"mediabunny";import*as B from"node-av";import{AudioSampleResource as kt}from"mediabunny";import*as ie from"node-av";var K=class extends kt{get frame(){if(!this._frame)throw new Error("AvFrameAudioSampleResource has been closed.");return this._frame}constructor(e){if(super(),!(e instanceof ie.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(e.getMediaType()!==ie.AVMEDIA_TYPE_AUDIO)throw new Error("AvFrameAudioSampleResource must be initialized with an audio frame.");this._frame=e}getFormat(){let e=De(this.frame.format);if(e===null){let r=ie.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 m(this.frame.data&&e<this.frame.data.length),k(this.frame.data[e])}},he=(t,e)=>{e.format=ze(t.format),e.nbSamples=t.numberOfFrames,e.sampleRate=t.sampleRate,e.channelLayout=J(t.numberOfChannels),e.allocBuffer(),m(e.data);for(let r=0;r<e.data.length;r++)t.copyTo(e.data[r],{planeIndex:r})};var ge=class extends Ot{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=Y[this.codec];m(r!==void 0);let i=B.Codec.findDecoder(r);if(i===null)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let n=new B.CodecContext;n.allocContext3(i),n.sampleRate=this.config.sampleRate,n.channelLayout=J(this.config.numberOfChannels),n.timeBase=new B.Rational(1,this.config.sampleRate),n.codecType=B.AVMEDIA_TYPE_AUDIO,n.codecId=r,n.extraData=this.config.description?Buffer.from(k(this.config.description)):null;let s=await n.open2();B.FFmpegError.throwIfError(s,"Open codec context"),this.codecContext=n}async decode(r){m(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 n=await this.codecContext.receiveFrame(this.frame);if(n===B.AVERROR_EAGAIN||n===B.AVERROR_EOF)break;this.receiveFrame(n)}}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 Ut(new K(i)))}async flush(){m(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 Lt,Quality as Dt,EncodedPacket as zt}from"mediabunny";import*as v from"node-av";var Ht=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],qt=[8e3,12e3,16e3,24e3,48e3],Wt=[8e3,11025,12e3,16e3,22050,24e3,32e3,44100,48e3],at=[32e3,44100,48e3],Fe=1024,Ce=class extends Lt{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:n,sampleRate:s}=i;return r==="aac"&&n>=1&&n<=48&&Ht.includes(s)||r==="opus"&&n>=1&&n<=255&&qt.includes(s)||r==="mp3"&&n>=1&&n<=2&&Wt.includes(s)||r==="vorbis"&&n>=1&&n<=255&&s<=2e5||r==="flac"&&n>=1&&n<=8&&s<=655350||r==="ac3"&&n>=1&&n<=6&&at.includes(s)||r==="eac3"&&n>=1&&n<=16&&at.includes(s)}async init(){this.frame=new v.Frame,this.frame.alloc(),this.packet=new v.Packet,this.packet.alloc();let r=Y[this.codec];m(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(){m(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=J(this.config.numberOfChannels),r.codecType=v.AVMEDIA_TYPE_AUDIO,r.codecId=Y[this.codec],r.sampleFormat=i,r.timeBase=new v.Rational(1,this.config.sampleRate),r.bitRate=BigInt(this.config.bitrate??new Dt("medium")._toAudioBitrate(this.codec)??0),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let n=await r.open2();v.FFmpegError.throwIfError(n,"Open codec context"),this.codecContext=r}async encode(r){this.codecContext===null&&(await this.createCodecContext(),m(this.codecContext)),this.firstExpectedTimestamp??=r.timestamp,r._data instanceof K?(this.frame.unref(),this.frame.ref(r._data.frame)):he(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=J(this.codecContext.channels),l=J(this.frame.channels),f=this.resampler.allocSetOpts2(a,this.codecContext.sampleFormat,this.codecContext.sampleRate,l,this.frame.format,this.frame.sampleRate);v.FFmpegError.throwIfError(f,"allocSetOpts2");let c=this.resampler.init();v.FFmpegError.throwIfError(c,"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||Fe,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(){m(this.codecContext),m(this.resampler),m(this.dstFrame),m(this.nextResamplerPts!==null);let r=this.codecContext.frameSize||Fe;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){m(this.codecContext);let i=await this.codecContext.sendFrame(r);for(v.FFmpegError.throwIfError(i,"Send frame");;){let n=await this.codecContext.receivePacket(this.packet);if(n===v.AVERROR_EAGAIN||n===v.AVERROR_EOF)break;this.receivePacket(n)}}receivePacket(r){if(m(this.codecContext),m(this.firstExpectedTimestamp!==null),v.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let i=Number(this.packet.pts)/this.codecContext.sampleRate,n=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 f=this.config.codec,c=this.codecContext.extraData?k(this.codecContext.extraData):void 0;if(this.codec==="aac"){if(!c)throw new Error("Extradata expected for AAC.");if(this.config.aac?.format==="adts"){let h=Ke(c);this.adtsHeaderTemplate=Qe(h),c=void 0}}else if(this.codec==="opus"){if(!c)throw new Error("Extradata expected for Opus.")}else if(this.codec==="vorbis"){if(!c)throw new Error("Extradata expected for Vorbis.")}else if(this.codec==="flac"){if(!c)throw new Error("Extradata expected for FLAC.");c=new Uint8Array([102,76,97,67,128,0,0,c.byteLength,...c])}a={decoderConfig:{codec:f,sampleRate:this.codecContext.sampleRate,numberOfChannels:this.codecContext.channels,description:c}}}if(this.adtsHeaderTemplate){let f=s.byteLength+this.adtsHeaderTemplate.header.byteLength;this.adtsHeaderTemplate.bitstream.pos=30,this.adtsHeaderTemplate.bitstream.writeBits(13,f);let c=new Uint8Array(this.adtsHeaderTemplate.header.byteLength+s.byteLength);c.set(this.adtsHeaderTemplate.header,0),c.set(s,this.adtsHeaderTemplate.header.byteLength),s=c}i+=this.outputTimestampOffset;let l=new zt(s,"key",i,n);this.packetEmitted=!0,this.onPacket(l,a)}async flush(){if(this.codecContext){e:if(this.resampler){m(this.resamplerInputSampleRate!==null);let r=this.resampler.getOutSamples(0);if(r===0)break e;let i=this.codecContext.frameSize||Fe;m(r<i);let n=Math.ceil((i-r)/this.codecContext.sampleRate*this.resamplerInputSampleRate);this.resampler.injectSilence(n),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()}};import{registerProresDecoder as Kt}from"@mediabunny/prores";var ut=Symbol.for("@mediabunny/server loaded");globalThis[ut]&&Xt._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[ut]=!0;var At=!1,X={},Mi=(t={})=>{if(typeof t!="object"||!t)throw new TypeError("options must be an object.");if(t.hardwareContext!=null&&!(t.hardwareContext instanceof q.HardwareContext||typeof t.hardwareContext=="function"))throw new TypeError("options.hardwareContext, when provided, must be a NodeAv.HardwareContext, a function, or null.");At||(At=!0,X=t,q.Log.setLevel(q.AV_LOG_ERROR),ct(ue),Kt(),lt(pe),ct(ge),lt(Ce),Yt(Xe))},ki=async(t,e)=>{if(!(t instanceof dt)&&!(t instanceof Gt))throw new TypeError("sample must be a VideoSample or an AudioSample.");if(!(e instanceof q.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(t instanceof dt){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 oe(t,e,null)}e.pts=BigInt(t.microsecondTimestamp),e.duration=BigInt(t.microsecondDuration),e.timeBase=new q.Rational(1,1e6)}else t._data instanceof K?(e.unref(),e.ref(t._data.frame)):he(t,e),e.timeBase=new q.Rational(1,t.sampleRate),e.pts=BigInt(Math.round(t.timestamp*t.sampleRate)),e.duration=BigInt(t.numberOfFrames)};export{K as AvFrameAudioSampleResource,H as AvFrameVideoSampleResource,X as _serverOptions,Mi as registerMediabunnyServer,ki as toAvFrame};
8
+ import{AudioSample as jt,Logging as Zt,registerDecoder as mt,registerEncoder as ft,registerVideoSampleTransformer as er,VideoSample as pt}from"mediabunny";import*as q from"node-av";import{CustomVideoDecoder as _t,VideoSample as Et}from"mediabunny";import*as b from"node-av";import*as i from"node-av";var Y={avc:i.AV_CODEC_ID_H264,hevc:i.AV_CODEC_ID_HEVC,vp8:i.AV_CODEC_ID_VP8,vp9:i.AV_CODEC_ID_VP9,av1:i.AV_CODEC_ID_AV1,prores:i.AV_CODEC_ID_PRORES,aac:i.AV_CODEC_ID_AAC,opus:i.AV_CODEC_ID_OPUS,mp3:i.AV_CODEC_ID_MP3,vorbis:i.AV_CODEC_ID_VORBIS,flac:i.AV_CODEC_ID_FLAC,ac3:i.AV_CODEC_ID_AC3,eac3:i.AV_CODEC_ID_EAC3,dts:i.AV_CODEC_ID_DTS},be,Re=()=>G.hardwareContext!==void 0&&typeof G.hardwareContext!="function"?G.hardwareContext:(be===void 0&&(be=i.HardwareContext.auto()),be),Ve=t=>{if(t!==null&&!(t instanceof i.HardwareContext))throw new TypeError("When serverOptions.hardwareContext is a function, it must return or resolve to a NodeAv.HardwareContext or null.")},xe=new Map,Ne=async t=>{if(typeof G.hardwareContext=="function"){let e=await G.hardwareContext(t);return Ve(e),e?.getDecoderCodec(t)??null}if(!xe.has(t)){let e=Re();xe.set(t,e?.getDecoderCodec(t)??null)}return xe.get(t)},ve=new Map,Me=async t=>{if(typeof G.hardwareContext=="function"){let e=await G.hardwareContext(t);return Ve(e),e?.getEncoderCodec(t)??null}if(!ve.has(t)){let e=Re();ve.set(t,e?.getEncoderCodec(t)??null)}return ve.get(t)},ke=t=>{switch(t){case"bt709":return i.AVCOL_PRI_BT709;case"bt470bg":return i.AVCOL_PRI_BT470BG;case"smpte170m":return i.AVCOL_PRI_SMPTE170M;case"bt2020":return i.AVCOL_PRI_BT2020;case"smpte432":return i.AVCOL_PRI_SMPTE432}return null},ae=t=>{switch(t){case i.AVCOL_PRI_BT709:return"bt709";case i.AVCOL_PRI_BT470BG:return"bt470bg";case i.AVCOL_PRI_SMPTE170M:return"smpte170m";case i.AVCOL_PRI_BT2020:return"bt2020";case i.AVCOL_PRI_SMPTE432:return"smpte432"}return null},Ue=t=>{switch(t){case"bt709":return i.AVCOL_TRC_BT709;case"smpte170m":return i.AVCOL_TRC_SMPTE170M;case"iec61966-2-1":return i.AVCOL_TRC_IEC61966_2_1;case"linear":return i.AVCOL_TRC_LINEAR;case"pq":return i.AVCOL_TRC_SMPTE2084;case"hlg":return i.AVCOL_TRC_ARIB_STD_B67}return null},ce=t=>{switch(t){case i.AVCOL_TRC_BT709:return"bt709";case i.AVCOL_TRC_SMPTE170M:return"smpte170m";case i.AVCOL_TRC_IEC61966_2_1:return"iec61966-2-1";case i.AVCOL_TRC_LINEAR:return"linear";case i.AVCOL_TRC_SMPTE2084:return"pq";case i.AVCOL_TRC_ARIB_STD_B67:return"hlg"}return null},Oe=t=>{switch(t){case"rgb":return i.AVCOL_SPC_RGB;case"bt709":return i.AVCOL_SPC_BT709;case"bt470bg":return i.AVCOL_SPC_BT470BG;case"smpte170m":return i.AVCOL_SPC_SMPTE170M;case"bt2020-ncl":return i.AVCOL_SPC_BT2020_NCL}return null},le=t=>{switch(t){case i.AVCOL_SPC_RGB:return"rgb";case i.AVCOL_SPC_BT709:return"bt709";case i.AVCOL_SPC_BT470BG:return"bt470bg";case i.AVCOL_SPC_SMPTE170M:return"smpte170m";case i.AVCOL_SPC_BT2020_NCL:return"bt2020-ncl"}return null},Le=t=>{switch(t){case i.AV_PIX_FMT_YUV420P:return"I420";case i.AV_PIX_FMT_YUVJ420P:return"I420";case i.AV_PIX_FMT_YUV420P10LE:return"I420P10";case i.AV_PIX_FMT_YUV420P12LE:return"I420P12";case i.AV_PIX_FMT_YUVA420P:return"I420A";case i.AV_PIX_FMT_YUVA420P10LE:return"I420AP10";case i.AV_PIX_FMT_YUV422P:return"I422";case i.AV_PIX_FMT_YUVJ422P:return"I422";case i.AV_PIX_FMT_YUV422P10LE:return"I422P10";case i.AV_PIX_FMT_YUV422P12LE:return"I422P12";case i.AV_PIX_FMT_YUVA422P:return"I422A";case i.AV_PIX_FMT_YUVA422P10LE:return"I422AP10";case i.AV_PIX_FMT_YUVA422P12LE:return"I422AP12";case i.AV_PIX_FMT_YUV444P:return"I444";case i.AV_PIX_FMT_YUVJ444P:return"I444";case i.AV_PIX_FMT_YUV444P10LE:return"I444P10";case i.AV_PIX_FMT_YUV444P12LE:return"I444P12";case i.AV_PIX_FMT_YUVA444P:return"I444A";case i.AV_PIX_FMT_YUVA444P10LE:return"I444AP10";case i.AV_PIX_FMT_YUVA444P12LE:return"I444AP12";case i.AV_PIX_FMT_NV12:return"NV12";case i.AV_PIX_FMT_RGBA:return"RGBA";case i.AV_PIX_FMT_RGB0:return"RGBX";case i.AV_PIX_FMT_BGRA:return"BGRA";case i.AV_PIX_FMT_BGR0:return"BGRX";default:return null}},_e=t=>{switch(t){case"I420":return i.AV_PIX_FMT_YUV420P;case"I420P10":return i.AV_PIX_FMT_YUV420P10LE;case"I420P12":return i.AV_PIX_FMT_YUV420P12LE;case"I420A":return i.AV_PIX_FMT_YUVA420P;case"I420AP10":return i.AV_PIX_FMT_YUVA420P10LE;case"I422":return i.AV_PIX_FMT_YUV422P;case"I422P10":return i.AV_PIX_FMT_YUV422P10LE;case"I422P12":return i.AV_PIX_FMT_YUV422P12LE;case"I422A":return i.AV_PIX_FMT_YUVA422P;case"I422AP10":return i.AV_PIX_FMT_YUVA422P10LE;case"I422AP12":return i.AV_PIX_FMT_YUVA422P12LE;case"I444":return i.AV_PIX_FMT_YUV444P;case"I444P10":return i.AV_PIX_FMT_YUV444P10LE;case"I444P12":return i.AV_PIX_FMT_YUV444P12LE;case"I444A":return i.AV_PIX_FMT_YUVA444P;case"I444AP10":return i.AV_PIX_FMT_YUVA444P10LE;case"I444AP12":return i.AV_PIX_FMT_YUVA444P12LE;case"NV12":return i.AV_PIX_FMT_NV12;case"RGBA":return i.AV_PIX_FMT_RGBA;case"RGBX":return i.AV_PIX_FMT_RGB0;case"BGRA":return i.AV_PIX_FMT_BGRA;case"BGRX":return i.AV_PIX_FMT_BGR0;default:return i.AV_PIX_FMT_NONE}},De=t=>{switch(t){case i.AV_SAMPLE_FMT_U8:return"u8";case i.AV_SAMPLE_FMT_S16:return"s16";case i.AV_SAMPLE_FMT_S32:return"s32";case i.AV_SAMPLE_FMT_FLT:return"f32";case i.AV_SAMPLE_FMT_U8P:return"u8-planar";case i.AV_SAMPLE_FMT_S16P:return"s16-planar";case i.AV_SAMPLE_FMT_S32P:return"s32-planar";case i.AV_SAMPLE_FMT_FLTP:return"f32-planar";default:return null}},ze=t=>{switch(t){case"u8":return i.AV_SAMPLE_FMT_U8;case"s16":return i.AV_SAMPLE_FMT_S16;case"s32":return i.AV_SAMPLE_FMT_S32;case"f32":return i.AV_SAMPLE_FMT_FLT;case"u8-planar":return i.AV_SAMPLE_FMT_U8P;case"s16-planar":return i.AV_SAMPLE_FMT_S16P;case"s32-planar":return i.AV_SAMPLE_FMT_S32P;case"f32-planar":return i.AV_SAMPLE_FMT_FLTP;default:return i.AV_SAMPLE_FMT_NONE}},J=t=>{switch(t){case 1:return i.AV_CHANNEL_LAYOUT_MONO;case 2:return i.AV_CHANNEL_LAYOUT_STEREO;case 4:return i.AV_CHANNEL_LAYOUT_QUAD;case 6:return i.AV_CHANNEL_LAYOUT_5POINT1_BACK;case 8:return i.AV_CHANNEL_LAYOUT_7POINT1;default:return{nbChannels:t,order:i.AV_CHANNEL_ORDER_UNSPEC,mask:0n}}},Ct=0x603n,He=t=>{switch(t){case 1:return i.AV_CHANNEL_LAYOUT_MONO;case 2:return i.AV_CHANNEL_LAYOUT_STEREO;case 4:return{nbChannels:4,order:i.AV_CHANNEL_ORDER_NATIVE,mask:Ct};case 5:return i.AV_CHANNEL_LAYOUT_5POINT0;case 6:return i.AV_CHANNEL_LAYOUT_5POINT1;default:return{nbChannels:t,order:i.AV_CHANNEL_ORDER_UNSPEC,mask:0n}}};var M=class M{constructor(){}static get level(){return M._level}static set level(e){if(e!==0&&e!==1&&e!==2&&e!==3)throw new TypeError("Invalid log level. Use one of the values of the LogLevel enum.");M._level=e}static get _emitter(){return M._emitterInstance??=new de}static on(e,r,n){return M._emitter.on(e,r,n)}static _error(...e){M._emitter._emit("error",e),M._level>=1&&console.error(...e)}static _warn(...e){M._emitter._emit("warn",e),M._level>=2&&console.warn(...e)}static _info(...e){M._emitter._emit("info",e),M._level>=3&&console.info(...e)}};M._level=3,M._emitterInstance=null;var j=M;function f(t){if(!t)throw new Error("Assertion failed.")}var ee=t=>t&&t[t.length-1];var A=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)},X=t=>{let e=A(t);return(e&1)===0?-(e>>1):e+1>>1};var k=t=>t.constructor===Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),Ee=t=>t.constructor===DataView?t:ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t);var qe={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12};var We={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18};var Xe={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9};var Se=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 te=(t,e,r)=>{let n=0,o=t.length-1,s=-1;for(;n<=o;){let a=n+(o-n+1)/2|0;r(t[a])<=e?(s=a,n=a+1):o=a-1}return s};var Be=t=>{throw new Error(`Unexpected value: ${t}`)};var sr=1e6*(1+Number.EPSILON);var Ae=t=>{f(Number.isInteger(t.num)),f(Number.isInteger(t.den)),f(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 n=e||1;return{num:t.num/n,den:t.den/n}};var de=class{constructor(){this._listeners=new Map}on(e,r,n){this._listeners.has(e)||this._listeners.set(e,new Set);let o={fn:r,once:n?.once??!1};return this._listeners.get(e).add(o),()=>{this._listeners.get(e)?.delete(o)}}_emit(...e){let[r,n]=e,o=this._listeners.get(r);if(o)for(let s of o){try{s.fn(n)}catch(a){console.error(a)}s.once&&o.delete(s)}}};import{VideoSampleResource as bt,VideoSampleColorSpace as xt,VideoSample as Ge}from"mediabunny";import*as p from"node-av";var vt=new Set([p.AV_PIX_FMT_YUVJ411P,p.AV_PIX_FMT_YUVJ420P,p.AV_PIX_FMT_YUVJ422P,p.AV_PIX_FMT_YUVJ440P,p.AV_PIX_FMT_YUVJ444P]),H=class t extends bt{get frame(){if(!this._frame)throw new Error("AvFrameVideoSampleResource has been closed.");return this._frame}constructor(e){if(super(),!(e instanceof p.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(e.getMediaType()!==p.AVMEDIA_TYPE_VIDEO)throw new Error("AvFrameVideoSampleResource must be initialized with a video frame.");this._frame=e}getFormat(){return Le(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 xt({primaries:ae(this.frame.colorPrimaries),transfer:ce(this.frame.colorTrc),matrix:le(this.frame.colorSpace),fullRange:this.frame.colorRange===p.AVCOL_RANGE_JPEG||vt.has(this.frame.format)?!0:this.frame.colorRange===p.AVCOL_RANGE_MPEG?!1:null})}close(){this.frame.free(),this._frame=null}getDataPlanes(){return f(this.frame.data),this.frame.data.map((e,r)=>({data:k(e),stride:this.frame.linesize[r]}))}async toRgbSample(e,r){let n=this.frame.width,o=this.frame.height,s=new p.SoftwareScaleContext,a=this.frame.format,l=_e("RGBA");s.getContext(n,o,a,n,o,l,p.SWS_BILINEAR);let m=new p.Frame;m.width=n,m.height=o,m.format=l,m.alloc(),m.allocBuffer();let c=this.frame;try{await s.scaleFrame(m,c)}finally{s.freeContext()}return m.sampleAspectRatio=c.sampleAspectRatio,new Ge(new t(m),e)}},oe=async(t,e,r)=>{f(t.format!==null),e.format=_e(t.format),e.width=t.codedWidth,e.height=t.codedHeight,e.sampleAspectRatio=new p.Rational(t.pixelAspectRatio.num,t.pixelAspectRatio.den),e.colorPrimaries=ke(t.colorSpace.primaries??"unknown")??p.AVCOL_PRI_UNSPECIFIED,e.colorSpace=Oe(t.colorSpace.matrix??"unknown")??p.AVCOL_SPC_UNSPECIFIED,e.colorTrc=Ue(t.colorSpace.transfer??"unknown")??p.AVCOL_TRC_UNSPECIFIED,e.colorRange=t.colorSpace.fullRange===!1?p.AVCOL_RANGE_MPEG:t.colorSpace.fullRange===!0?p.AVCOL_RANGE_JPEG:p.AVCOL_RANGE_UNSPECIFIED;let n=t.allocationSize();return(!r||r.byteLength!==n)&&(r=Buffer.from({length:n})),await t.copyTo(r),e.fromBuffer(r),r},Ye=async(t,e)=>{let r,n=!1;if(t._data instanceof H)r=t._data.frame;else{if(t.format===null)return null;r=new p.Frame,r.alloc(),n=!0,await oe(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 p.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}`,l=s.createFilter(p.Filter.getByName("buffer"),"src",a),m=s.createFilter(p.Filter.getByName("buffersink"),"sink");f(l&&m);let c=p.FilterInOut.createList([{name:"in",filterCtx:l,padIdx:0}]),d=p.FilterInOut.createList([{name:"out",filterCtx:m,padIdx:0}]),h=s.parsePtr(`[in]${o.join(",")}[out]`,d,c);p.FFmpegError.throwIfError(h,"FilterGraph.parsePtr");let y=await s.config();p.FFmpegError.throwIfError(y,"FilterGraph.config");let F=await l.buffersrcAddFrame(r);p.FFmpegError.throwIfError(F,"buffersrcAddFrame"),await l.buffersrcAddFrame(null);let g=new p.Frame;g.alloc();let x=await m.buffersinkGetFrame(g);return p.FFmpegError.throwIfError(x,"buffersinkGetFrame"),new Ge(new H(g),{timestamp:t.timestamp,duration:t.duration,rotation:0})}finally{s.free(),n&&r.free()}};var ue=class extends _t{constructor(){super(...arguments);this.codecContext=null;this.preciseTimings=[]}static supports(r,n){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){f(this.codecContext===null);let n=Y[this.codec];f(n!==void 0);let o;if(this.codec==="vp9"&&r.sideData.alpha?o=b.Codec.findDecoderByName(b.FF_DECODER_LIBVPX_VP9)??b.Codec.findDecoder(n):this.config.hardwareAcceleration==="prefer-software"||this.codec==="av1"?o=b.Codec.findDecoder(n):o=await Ne(n)??b.Codec.findDecoder(n),!o)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let s=new b.CodecContext;s.allocContext3(o),this.pixelAspectRatio=Ae({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=n,s.extraData=this.config.description?Buffer.from(k(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),f(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 n=te(this.preciseTimings,r.microsecondTimestamp,a=>a.microsecondTimestamp),o=n!==-1?this.preciseTimings[n]:null;o&&o.microsecondTimestamp===r.microsecondTimestamp?(o.timestamp!==r.timestamp&&(o.timestampIsValid=!1),o.duration!==r.duration&&(o.durationIsValid=!1)):(this.preciseTimings.splice(n+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 n=Number(this.frame.pts)/1e6,o=Number(this.frame.duration)/1e6,s=te(this.preciseTimings,Number(this.frame.pts),m=>m.microsecondTimestamp),a=s!==-1?this.preciseTimings[s]:null;a&&a.microsecondTimestamp===Number(this.frame.pts)&&(a.timestampIsValid&&(n=a.timestamp),a.durationIsValid&&(o=a.duration));let l=this.frame.clone();if(!l)throw new Error("Frame clone allocation failed.");this.onSample(new Et(new H(l),{timestamp:n,duration:o}))}async flush(){if(!this.codecContext)return;let r=await this.codecContext.sendPacket(null);for(b.FFmpegError.throwIfError(r,"Flush decoder");;){let n=await this.codecContext.receiveFrame(this.frame);if(n===b.AVERROR_EAGAIN||n===b.AVERROR_EOF)break;this.receiveFrame(n)}this.codecContext.flushBuffers()}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free()}};import{CustomVideoEncoder as Ot,Quality as Lt,EncodedPacket as Dt}from"mediabunny";import*as u from"node-av";var z=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,n=7-(this.pos&7),o=(r&1<<n)>>n;return this.pos++,o}readBits(e){if(e===1)return this.readBit();let r=0;for(let n=0;n<e;n++)r<<=1,r|=this.readBit();return r}writeBits(e,r){let n=this.pos+e;for(let o=this.pos;o<n;o++){let s=Math.floor(o/8),a=this.bytes[s],l=7-(o&7);a&=~(1<<l),a|=(r&1<<n-o-1)>>n-o-1<<l,this.bytes[s]=a}this.pos=n}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 Ke=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],St=[-1,1,2,3,4,5,6,8],Qe=t=>{if(!t||t.byteLength<2)throw new TypeError("AAC description must be at least 2 bytes long.");let e=new z(t),r=e.readBits(5);r===31&&(r=32+e.readBits(6));let n=e.readBits(4),o=null;n===15?o=e.readBits(24):n<Ke.length&&(o=Ke[n]);let s=e.readBits(4),a=null;return s>=1&&s<=7&&(a=St[s]),{objectType:r,frequencyIndex:n,sampleRate:o,channelConfiguration:s,numberOfChannels:a}};var $e=t=>{let e=new Uint8Array(7),r=new z(e),{objectType:n,frequencyIndex:o,channelConfiguration:s}=t,a=n-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 Bt=["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"],wt=["aac","opus","mp3","vorbis","flac","ac3","eac3","dts"],Fr=[...wt,...Bt];var we=[{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 Z=[{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 Je=".01.01.01.01.00",je=".0.110.01.01.01.0",It=["ap4x","ap4h","apch","apcn","apcs","apco"];var re=t=>{let{codec:e,codecDescription:r,colorSpace:n,avcCodecInfo:o,hevcCodecInfo:s,vp9CodecInfo:a,av1CodecInfo:l,proresFormat:m}=t;if(e==="avc"){if(f(t.avcType!==null),o){let c=new Uint8Array([o.avcProfileIndication,o.profileCompatibility,o.avcLevelIndication]);return`avc${t.avcType}.${Se(c)}`}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}.${Se(r.subarray(1,4))}`}else if(e==="hevc"){let c,d,h,y,F,g;if(s)c=s.generalProfileSpace,d=s.generalProfileIdc,h=ye(s.generalProfileCompatibilityFlags),y=s.generalTierFlag,F=s.generalLevelIdc,g=[...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 C=Ee(r),_=C.getUint8(1);c=_>>6&3,d=_&31,h=ye(C.getUint32(2)),y=_>>5&1,F=C.getUint8(12),g=[];for(let T=0;T<6;T++)g.push(C.getUint8(6+T))}let x="hev1.";for(x+=["","A","B","C"][c]+d,x+=".",x+=h.toString(16).toUpperCase(),x+=".",x+=y===0?"L":"H",x+=F;g.length>0&&g[g.length-1]===0;)g.pop();return g.length>0&&(x+=".",x+=g.map(C=>C.toString(16).toUpperCase()).join(".")),x}else{if(e==="vp8")return"vp8";if(e==="vp9"){if(!a){let T=t.width*t.height,B=ee(Z).level;for(let P of Z)if(T<=P.maxPictureSize){B=P.level;break}return`vp09.00.${B.toString().padStart(2,"0")}.08`}let c=a.profile.toString().padStart(2,"0"),d=a.level.toString().padStart(2,"0"),h=a.bitDepth.toString().padStart(2,"0"),y=a.chromaSubsampling.toString().padStart(2,"0"),F=a.colourPrimaries.toString().padStart(2,"0"),g=a.transferCharacteristics.toString().padStart(2,"0"),x=a.matrixCoefficients.toString().padStart(2,"0"),C=a.videoFullRangeFlag.toString().padStart(2,"0"),_=`vp09.${c}.${d}.${h}.${y}`;return _+=`.${F}.${g}.${x}.${C}`,_.endsWith(Je)&&(_=_.slice(0,-Je.length)),_}else if(e==="av1"){if(!l){let P=t.width*t.height,w=ee(Z).level;for(let E of Z)if(P<=E.maxPictureSize){w=E.level;break}return`av01.0.${w.toString().padStart(2,"0")}M.08`}let c=l.profile,d=l.level.toString().padStart(2,"0"),h=l.tier?"H":"M",y=l.bitDepth.toString().padStart(2,"0"),F=l.monochrome?"1":"0",g=100*l.chromaSubsamplingX+10*l.chromaSubsamplingY+1*(l.chromaSubsamplingX&&l.chromaSubsamplingY?l.chromaSamplePosition:0),x=n?.primaries?qe[n.primaries]:1,C=n?.transfer?We[n.transfer]:1,_=n?.matrix?Xe[n.matrix]:1,T=n?.fullRange?1:0,B=`av01.${c}.${d}${h}.${y}`;return B+=`.${F}.${g.toString().padStart(3,"0")}`,B+=`.${x.toString().padStart(2,"0")}`,B+=`.${C.toString().padStart(2,"0")}`,B+=`.${_.toString().padStart(2,"0")}`,B+=`.${T}`,B.endsWith(je)&&(B=B.slice(0,-je.length)),B}else{if(e==="prores")return m??"apch";e!==null&&Be(e)}}throw new TypeError(`Unhandled codec '${e}'.`)};var Pr=["avc1","avc3","hev1","hvc1","vp8","vp09","av01",...It];var fe=function*(t){let e=0,r=-1;for(;e<t.length-2;){let n=t.indexOf(0,e);if(n===-1||n>=t.length-2)break;e=n;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 Ie=t=>t&31,Te=t=>{let e=[],r=t.length;for(let n=0;n<r;n++)n+2<r&&t[n]===0&&t[n+1]===0&&t[n+2]===3?(e.push(0,0),n+=2):e.push(t[n]);return new Uint8Array(e)},Qr=new Uint8Array([0,0,0,1]);var tt=t=>{try{let e=[],r=[],n=[];for(let l of fe(t)){let m=t.subarray(l.offset,l.offset+l.length),c=Ie(m[0]);c===7?e.push(m):c===8?r.push(m):c===13&&n.push(m)}if(e.length===0||r.length===0)return null;let o=e[0],s=Tt(o);f(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?n:null}}catch(e){return j._error("Error building AVC Decoder Configuration Record:",e),null}},rt=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 n=r.byteLength;e.push(n>>8),e.push(n&255);for(let o=0;o<n;o++)e.push(r[o])}e.push(t.pictureParameterSets.length);for(let r of t.pictureParameterSets){let n=r.byteLength;e.push(n>>8),e.push(n&255);for(let o=0;o<n;o++)e.push(r[o])}if(t.avcProfileIndication===100||t.avcProfileIndication===110||t.avcProfileIndication===122||t.avcProfileIndication===144){f(t.chromaFormat!==null),f(t.bitDepthLumaMinus8!==null),f(t.bitDepthChromaMinus8!==null),f(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 n=r.byteLength;e.push(n>>8),e.push(n&255);for(let o=0;o<n;o++)e.push(r[o])}}return new Uint8Array(e)};var nt={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}},Tt=t=>{try{let e=new z(Te(t));if(e.skipBits(1),e.skipBits(2),e.readBits(5)!==7)return null;let n=e.readAlignedByte(),o=e.readAlignedByte(),s=e.readAlignedByte();A(e);let a=1,l=0,m=0,c=0;if((n===100||n===110||n===122||n===244||n===44||n===83||n===86||n===118||n===128)&&(a=A(e),a===3&&(c=e.readBits(1)),l=A(e),m=A(e),e.skipBits(1),e.readBits(1))){for(let S=0;S<(a!==3?8:12);S++)if(e.readBits(1)){let Q=S<6?16:64,L=8,V=8;for(let D=0;D<Q;D++){if(V!==0){let $=X(e);V=(L+$+256)%256}L=V===0?L:V}}}A(e);let d=A(e);if(d===0)A(e);else if(d===1){e.skipBits(1),X(e),X(e);let U=A(e);for(let S=0;S<U;S++)X(e)}A(e),e.skipBits(1);let h=A(e),y=A(e),F=16*(h+1),g=16*(y+1),x=F,C=g,_=e.readBits(1);if(_||e.skipBits(1),e.skipBits(1),e.readBits(1)){let U=A(e),S=A(e),W=A(e),Q=A(e),L,V;if((c===0?a:0)===0)L=1,V=2-_;else{let $=a===3?1:2,ie=a===1?2:1;L=$,V=ie*(2-_)}x-=L*(U+S),C-=V*(W+Q)}let B=2,P=2,w=2,E=0,N={num:1,den:1},R=null,O=null;if(e.readBits(1)){if(e.readBits(1)){let ie=e.readBits(8);if(ie===255)N={num:e.readBits(16),den:e.readBits(16)};else{let Pe=nt[ie];Pe&&(N=Pe)}}e.readBits(1)&&e.skipBits(1),e.readBits(1)&&(e.skipBits(3),E=e.readBits(1),e.readBits(1)&&(B=e.readBits(8),P=e.readBits(8),w=e.readBits(8))),e.readBits(1)&&(A(e),A(e)),e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.skipBits(1));let V=e.readBits(1);V&&Ze(e);let D=e.readBits(1);D&&Ze(e),(V||D)&&e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(1),A(e),A(e),A(e),A(e),R=A(e),O=A(e))}if(R===null){f(O===null);let U=o&16;if((n===44||n===86||n===100||n===110||n===122||n===244)&&U)R=0,O=0;else{let S=h+1,W=y+1,Q=(2-_)*W,L=we.find(D=>D.level>=s)??ee(we),V=Math.min(Math.floor(L.maxDpbMbs/(S*Q)),16);R=V,O=V}}return f(O!==null),{profileIdc:n,constraintFlags:o,levelIdc:s,frameMbsOnlyFlag:_,chromaFormatIdc:a,bitDepthLumaMinus8:l,bitDepthChromaMinus8:m,codedWidth:F,codedHeight:g,displayWidth:x,displayHeight:C,pixelAspectRatio:N,colourPrimaries:B,matrixCoefficients:w,transferCharacteristics:P,fullRangeFlag:E,numReorderFrames:R,maxDecFrameBuffering:O}}catch(e){return j._error("Error parsing AVC SPS:",e),null}},Ze=t=>{let e=A(t);t.skipBits(4),t.skipBits(4);for(let r=0;r<=e;r++)A(t),A(t),t.skipBits(1);t.skipBits(5),t.skipBits(5),t.skipBits(5),t.skipBits(5)};var me=t=>t>>1&63,Ft=t=>{try{let e=new z(Te(t));e.skipBits(16),e.readBits(4);let r=e.readBits(3),n=e.readBits(1),{general_profile_space:o,general_tier_flag:s,general_profile_idc:a,general_profile_compatibility_flags:l,general_constraint_indicator_flags:m,general_level_idc:c}=Pt(e,r);A(e);let d=A(e),h=0;d===3&&(h=e.readBits(1));let y=A(e),F=A(e),g=y,x=F;if(e.readBits(1)){let S=A(e),W=A(e),Q=A(e),L=A(e),V=1,D=1,$=h===0?d:0;$===1?(V=2,D=2):$===2&&(V=2,D=1),g-=(S+W)*V,x-=(Q+L)*D}let C=A(e),_=A(e);A(e);let B=e.readBits(1)?0:r,P=0;for(let S=B;S<=r;S++)A(e),P=A(e),A(e);A(e),A(e),A(e),A(e),A(e),A(e),e.readBits(1)&&e.readBits(1)&&Rt(e),e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(4),e.skipBits(4),A(e),A(e),e.skipBits(1));let w=A(e);if(Vt(e,w),e.readBits(1)){let S=A(e);for(let W=0;W<S;W++)A(e),e.skipBits(1)}e.skipBits(1),e.skipBits(1);let E=2,N=2,R=2,O=0,se=0,U={num:1,den:1};if(e.readBits(1)){let S=Mt(e,r);U=S.pixelAspectRatio,E=S.colourPrimaries,N=S.transferCharacteristics,R=S.matrixCoefficients,O=S.fullRangeFlag,se=S.minSpatialSegmentationIdc}return{displayWidth:g,displayHeight:x,pixelAspectRatio:U,colourPrimaries:E,transferCharacteristics:N,matrixCoefficients:R,fullRangeFlag:O,maxDecFrameBuffering:P+1,spsMaxSubLayersMinus1:r,spsTemporalIdNestingFlag:n,generalProfileSpace:o,generalTierFlag:s,generalProfileIdc:a,generalProfileCompatibilityFlags:l,generalConstraintIndicatorFlags:m,generalLevelIdc:c,chromaFormatIdc:d,bitDepthLumaMinus8:C,bitDepthChromaMinus8:_,minSpatialSegmentationIdc:se}}catch(e){return j._error("Error parsing HEVC SPS:",e),null}},it=t=>{try{let e=[],r=[],n=[],o=[];for(let c of fe(t)){let d=t.subarray(c.offset,c.offset+c.length),h=me(d[0]);h===32?e.push(d):h===33?r.push(d):h===34?n.push(d):(h===39||h===40)&&o.push(d)}if(r.length===0||n.length===0)return null;let s=Ft(r[0]);if(!s)return null;let a=0;if(n.length>0){let c=n[0],d=new z(Te(c));d.skipBits(16),A(d),A(d),d.skipBits(1),d.skipBits(1),d.skipBits(3),d.skipBits(1),d.skipBits(1),A(d),A(d),X(d),d.skipBits(1),d.skipBits(1),d.readBits(1)&&A(d),X(d),X(d),d.skipBits(1),d.skipBits(1),d.skipBits(1),d.skipBits(1);let h=d.readBits(1),y=d.readBits(1);!h&&!y?a=0:h&&!y?a=2:!h&&y?a=3:a=0}let l=[...e.length?[{arrayCompleteness:1,nalUnitType:32,nalUnits:e}]:[],...r.length?[{arrayCompleteness:1,nalUnitType:33,nalUnits:r}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:34,nalUnits:n}]:[],...o.length?[{arrayCompleteness:1,nalUnitType:me(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:l}}catch(e){return j._error("Error building HEVC Decoder Configuration Record:",e),null}},Pt=(t,e)=>{let r=t.readBits(2),n=t.readBits(1),o=t.readBits(5),s=0;for(let d=0;d<32;d++)s=s<<1|t.readBits(1);let a=new Uint8Array(6);for(let d=0;d<6;d++)a[d]=t.readBits(8);let l=t.readBits(8),m=[],c=[];for(let d=0;d<e;d++)m.push(t.readBits(1)),c.push(t.readBits(1));if(e>0)for(let d=e;d<8;d++)t.skipBits(2);for(let d=0;d<e;d++)m[d]&&t.skipBits(88),c[d]&&t.skipBits(8);return{general_profile_space:r,general_tier_flag:n,general_profile_idc:o,general_profile_compatibility_flags:s,general_constraint_indicator_flags:a,general_level_idc:l}},Rt=t=>{for(let e=0;e<4;e++)for(let r=0;r<(e===3?2:6);r++)if(!t.readBits(1))A(t);else{let o=Math.min(64,1<<4+(e<<1));e>1&&X(t);for(let s=0;s<o;s++)X(t)}},Vt=(t,e)=>{let r=[];for(let n=0;n<e;n++)r[n]=Nt(t,n,e,r)},Nt=(t,e,r,n)=>{let o=0,s=0,a=0;if(e!==0&&(s=t.readBits(1)),s){if(e===r){let m=A(t);a=e-(m+1)}else a=e-1;t.readBits(1),A(t);let l=n[a]??0;for(let m=0;m<=l;m++)t.readBits(1)||t.readBits(1);o=n[a]}else{let l=A(t),m=A(t);for(let c=0;c<l;c++)A(t),t.readBits(1);for(let c=0;c<m;c++)A(t),t.readBits(1);o=l+m}return o},Mt=(t,e)=>{let r=2,n=2,o=2,s=0,a=0,l={num:1,den:1};if(t.readBits(1)){let m=t.readBits(8);if(m===255)l={num:t.readBits(16),den:t.readBits(16)};else{let c=nt[m];c&&(l=c)}}return t.readBits(1)&&t.readBits(1),t.readBits(1)&&(t.readBits(3),s=t.readBits(1),t.readBits(1)&&(r=t.readBits(8),n=t.readBits(8),o=t.readBits(8))),t.readBits(1)&&(A(t),A(t)),t.readBits(1),t.readBits(1),t.readBits(1),t.readBits(1)&&(A(t),A(t),A(t),A(t)),t.readBits(1)&&(t.readBits(32),t.readBits(32),t.readBits(1)&&A(t),t.readBits(1)&&kt(t,!0,e)),t.readBits(1)&&(t.readBits(1),t.readBits(1),t.readBits(1),a=A(t),A(t),A(t),A(t),A(t)),{pixelAspectRatio:l,colourPrimaries:r,transferCharacteristics:n,matrixCoefficients:o,fullRangeFlag:s,minSpatialSegmentationIdc:a}},kt=(t,e,r)=>{let n=!1,o=!1,s=!1;e&&(n=t.readBits(1)===1,o=t.readBits(1)===1,(n||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 l=t.readBits(1)===1,m=!0;l||(m=t.readBits(1)===1);let c=!1;m?A(t):c=t.readBits(1)===1;let d=1;c||(d=A(t)+1),n&&et(t,d,s),o&&et(t,d,s)}},et=(t,e,r)=>{for(let n=0;n<e;n++)A(t),A(t),r&&(A(t),A(t)),t.readBits(1)},ot=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 n of r.nalUnits){e.push(n.length>>8&255),e.push(n.length&255);for(let o=0;o<n.length;o++)e.push(n[o])}}return new Uint8Array(e)};var st=t=>{let e=new z(t);if(e.readBits(2)!==2)return null;let n=e.readBits(1),s=(e.readBits(1)<<1)+n;if(s===3&&e.skipBits(1),e.readBits(1)===1||e.readBits(1)!==0||(e.skipBits(2),e.readBits(24)!==4817730))return null;let c=8;s>=2&&(c=e.readBits(1)?12:10);let d=e.readBits(3),h=0,y=0;if(d!==7)if(y=e.readBits(1),s===1||s===3){let N=e.readBits(1),R=e.readBits(1);h=!N&&!R?3:N&&!R?2:1,e.skipBits(1)}else h=1;else h=3,y=1;let F=e.readBits(16),g=e.readBits(16),x=F+1,C=g+1,_=x*C,T=ee(Z).level;for(let E of Z)if(_<=E.maxPictureSize){T=E.level;break}return{profile:s,level:T,bitDepth:c,chromaSubsampling:h,videoFullRangeFlag:y,colourPrimaries:d===2?1:d===1?6:2,transferCharacteristics:d===2?1:d===1?6:2,matrixCoefficients:d===7?0:d===2?1:d===1?6:2}},Ut=function*(t){let e=new z(t),r=()=>{let n=0;for(let o=0;o<8;o++){let s=e.readAlignedByte();if(n|=(s&127)<<o*7,!(s&128))break;if(o===7&&s&128)return null}return n>=2**32-1?null:n};for(;e.getBitsLeft()>=8;){e.skipBits(1);let n=e.readBits(4),o=e.readBits(1),s=e.readBits(1);e.skipBits(1),o&&e.skipBits(8);let a;if(s){let l=r();if(l===null)return;a=l}else a=Math.floor(e.getBitsLeft()/8);f(e.pos%8===0),yield{type:n,data:t.subarray(e.pos/8,e.pos/8+a)},e.skipBits(a*8)}},at=t=>{for(let{type:e,data:r}of Ut(t)){if(e!==1)continue;let n=new z(r),o=n.readBits(3),s=n.readBits(1),a=n.readBits(1),l=0,m=0,c=0;if(a)l=n.readBits(5);else{if(n.readBits(1)&&(n.skipBits(32),n.skipBits(32),n.readBits(1)))return null;let E=n.readBits(1);E&&(c=n.readBits(5),n.skipBits(32),n.skipBits(5),n.skipBits(5));let N=n.readBits(5);for(let R=0;R<=N;R++){n.skipBits(12);let O=n.readBits(5);if(R===0&&(l=O),O>7){let U=n.readBits(1);R===0&&(m=U)}if(E&&n.readBits(1)){let S=c+1;n.skipBits(S),n.skipBits(S),n.skipBits(1)}n.readBits(1)&&n.skipBits(4)}}let d=n.readBits(4),h=n.readBits(4),y=d+1;n.skipBits(y);let F=h+1;n.skipBits(F);let g=0;if(a?g=0:g=n.readBits(1),g&&(n.skipBits(4),n.skipBits(3)),n.skipBits(1),n.skipBits(1),n.skipBits(1),!a){n.skipBits(1),n.skipBits(1),n.skipBits(1),n.skipBits(1);let w=n.readBits(1);w&&(n.skipBits(1),n.skipBits(1));let E=n.readBits(1),N=0;E?N=2:N=n.readBits(1),N>0&&(n.readBits(1)||n.skipBits(1)),w&&n.skipBits(3)}n.skipBits(1),n.skipBits(1),n.skipBits(1);let x=n.readBits(1),C=8;o===2&&x?C=n.readBits(1)?12:10:o<=2&&(C=x?10:8);let _=0;o!==1&&(_=n.readBits(1));let T=1,B=1,P=0;return _||(o===0?(T=1,B=1):o===1?(T=0,B=0):C===12&&(T=n.readBits(1),T&&(B=n.readBits(1))),T&&B&&(P=n.readBits(2))),{profile:o,level:l,tier:m,bitDepth:C,monochrome:_,chromaSubsamplingX:T,chromaSubsamplingY:B,chromaSamplePosition:P}}return null};var $r=[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 Jr=new Uint8Array([5,4,65,67,45,51]),jr=new Uint8Array([5,4,69,65,67,51]);var zt={apco:u.AV_PROFILE_PRORES_PROXY,apcs:u.AV_PROFILE_PRORES_LT,apcn:u.AV_PROFILE_PRORES_STANDARD,apch:u.AV_PROFILE_PRORES_HQ,ap4h:u.AV_PROFILE_PRORES_4444,ap4x:u.AV_PROFILE_PRORES_XQ},pe=class extends Ot{constructor(){super(...arguments);this.codecContext=null;this.scaler=null;this.dstFrame=null;this.lastBuffer=null;this.packetEmitted=!1;this.lastScalerKey=null;this.quantizer=null;this.preciseTimings=[]}static supports(r,n){return n.bitrateMode==="quantizer"?r==="avc"||r==="hevc"||r==="vp9"||r==="av1":r==="avc"||r==="hevc"||r==="vp8"||r==="vp9"||r==="av1"||r==="prores"}async init(){this.frame=new u.Frame,this.frame.alloc(),this.frame.timeBase=new u.Rational(1,1e6),this.packet=new u.Packet,this.packet.alloc();let r=Y[this.codec];f(r!==void 0);let n=()=>{if(this.codec==="prores"){let s=u.Codec.findEncoderByName(u.FF_ENCODER_PRORES_KS);if(s)return s}return u.Codec.findEncoder(r)},o=null;if(this.codec==="vp9"&&this.config.alpha==="keep")o=u.Codec.findEncoderByName(u.FF_ENCODER_LIBVPX_VP9)??u.Codec.findEncoder(r);else if(this.config.hardwareAcceleration==="prefer-software")o=n();else{let s=await Me(r);s&&this.config.bitrateMode==="quantizer"&&!s.name?.endsWith("_nvenc")&&(s=null),o=s??n()}if(!o)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=o,this.config.bitrateMode!=="quantizer"&&await this.createCodecContext()}async createCodecContext(){f(this.codecContext===null);let r=new u.CodecContext;r.allocContext3(this.avCodec);let n=u.AV_PIX_FMT_YUV420P;this.avCodec.pixelFormats&&(this.avCodec.pixelFormats.includes(u.AV_PIX_FMT_YUV420P)||(n=this.avCodec.pixelFormats[0]),this.config.alpha==="keep"&&(this.avCodec.pixelFormats.includes(u.AV_PIX_FMT_YUVA420P)?n=u.AV_PIX_FMT_YUVA420P:n=u.avcodecFindBestPixFmtOfList(this.avCodec.pixelFormats,u.AV_PIX_FMT_YUVA444P12LE)));let o=Ae({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=n,r.timeBase=new u.Rational(1,1e6),r.gopSize=60,r.framerate=new u.Rational(Math.round(this.config.framerate??0)||30,1),r.bitRate=this.config.bitrateMode==="quantizer"?0n:BigInt(this.config.bitrate??new Lt("medium")._toVideoBitrate(this.codec,this.config.width,this.config.height)),r.sampleAspectRatio=new u.Rational(o.num,o.den),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let s=this.config.latencyMode==="realtime";if(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")):(this.avCodec.name==="h264_nvenc"||this.avCodec.name==="hevc_nvenc")&&r.setOption("forced-idr","1"),this.config.bitrateMode==="quantizer"){f(this.quantizer!==null);let l;if(this.avCodec.name==="libaom-av1"||this.avCodec.name==="libsvtav1"?l=Math.round(this.quantizer/4):l=this.quantizer,this.avCodec.name==="libx264"||this.avCodec.name==="libx265")r.setOption("qp",String(l));else if(this.avCodec.name==="libvpx-vp9"||this.avCodec.name==="libaom-av1")r.setOption("crf",String(l));else if(this.avCodec.name==="libsvtav1")r.setOption("qp",String(l));else if(this.avCodec.name==="librav1e")r.setOption("qp",String(l));else if(this.avCodec.name?.endsWith("_nvenc"))r.setOption("rc","constqp"),r.setOption("qp",String(l));else throw new Error(`Encoder '${this.avCodec.name}' cannot be used for quantizer-based encoding.`);r.qMin=l,r.qMax=l}if(this.codec==="prores"){let l=zt[this.config.codec];f(l!==void 0),r.setOption("profile",String(l))}let a=await r.open2();u.FFmpegError.throwIfError(a,"Open codec context"),this.codecContext=r}async encode(r,n){if(this.config.bitrateMode==="quantizer"){let c;if(this.codec==="avc"?c=n.avc?.quantizer:this.codec==="hevc"?c=n.hevc?.quantizer:this.codec==="vp9"?c=n.vp9?.quantizer:c=n.av1?.quantizer,f(c!=null),this.codecContext!==null&&c!==this.quantizer){let d=await this.codecContext.sendFrame(null);for(u.FFmpegError.throwIfError(d,"Send frame");;){let h=await this.codecContext.receivePacket(this.packet);if(h===u.AVERROR_EAGAIN||h===u.AVERROR_EOF)break;this.receivePacket(h)}this.codecContext.freeContext(),this.codecContext=null}this.quantizer=c}if(this.codecContext===null&&await this.createCodecContext(),f(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 oe(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 u.SoftwareScaleContext);let c=`${this.frame.width}x${this.frame.height}:${this.frame.format}`;if(c!==this.lastScalerKey){this.scaler.getContext(this.frame.width,this.frame.height,this.frame.format,this.codecContext.width,this.codecContext.height,this.codecContext.pixelFormat,u.SWS_FAST_BILINEAR),this.lastScalerKey=c;let h=this.scaler.initContext();u.FFmpegError.throwIfError(h,"initContext")}this.dstFrame||(this.dstFrame=new u.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 u.Rational(1,1e6),o.pictType=n?.keyFrame?u.AV_PICTURE_TYPE_I:u.AV_PICTURE_TYPE_NONE,o.keyFrame=n?.keyFrame?1:0;let a=te(this.preciseTimings,r.microsecondTimestamp,c=>c.microsecondTimestamp),l=a!==-1?this.preciseTimings[a]:null;l&&l.microsecondTimestamp===r.microsecondTimestamp?(l.timestamp!==r.timestamp&&(l.timestampIsValid=!1),l.duration!==r.duration&&(l.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 m=await this.codecContext.sendFrame(o);for(u.FFmpegError.throwIfError(m,"Send frame");;){let c=await this.codecContext.receivePacket(this.packet);if(c===u.AVERROR_EAGAIN||c===u.AVERROR_EOF)break;this.receivePacket(c)}}receivePacket(r){if(f(this.codecContext),u.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let n=k(this.packet.data),o=Number(this.packet.pts)/1e6,s=Number(this.packet.duration)/1e6,a=te(this.preciseTimings,Number(this.packet.pts),g=>g.microsecondTimestamp),l=a!==-1?this.preciseTimings[a]:null;l&&l.microsecondTimestamp===Number(this.packet.pts)&&(l.timestampIsValid&&(o=l.timestamp),l.durationIsValid&&(s=l.duration));let m={},c=null,d=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=tt(this.packet.data);if(!C)throw new Error("Invalid AVC data, could not extract decoder configuration record.");x=rt(C)}else{let C=it(this.packet.data);if(!C)throw new Error("Invalid HEVC data, could not extract decoder configuration record.");x=ot(C)}c=re({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,proresFormat:null}),g||(d=x)}if(!g){let C=[];for(let w of fe(n))if(this.codec==="avc"){let E=Ie(n[w.offset]);E!==7&&E!==8&&E!==13&&C.push(w)}else{let E=me(n[w.offset]);E!==33&&E!==34&&E!==32&&C.push(w)}let _=0;for(let w of C)_+=4+w.length;let T=new Uint8Array(_),B=new DataView(T.buffer),P=0;for(let w of C){let E=w.length;B.setUint32(P,E,!1),P+=4,T.set(n.subarray(w.offset,w.offset+w.length),P),P+=w.length}n=T}}else if(this.codec==="vp8")this.packetEmitted||(c=re({width:this.config.width,height:this.config.height,codec:"vp8",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null,proresFormat:null}));else if(this.codec==="vp9"){if(!this.packetEmitted){let g=st(n);c=re({width:this.config.width,height:this.config.height,codec:"vp9",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:g,av1CodecInfo:null,proresFormat:null})}}else if(this.codec==="av1"){if(!this.packetEmitted){let g=at(n);c=re({width:this.config.width,height:this.config.height,codec:"av1",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:g,proresFormat:null})}}else if(this.codec==="prores")this.packetEmitted||(c=re({width:this.config.width,height:this.config.height,codec:"prores",codecDescription:null,colorSpace:null,avcType:null,avcCodecInfo:null,hevcCodecInfo:null,vp9CodecInfo:null,av1CodecInfo:null,proresFormat:this.config.codec}));else throw new Error("Unreachable.");let h={},y=this.packet.getSideData(u.AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL);y&&(h.alpha=k(y).subarray(8));let F=new Dt(n,this.packet.isKeyframe?"key":"delta",o,s,void 0,void 0,h);c!==null&&(m.decoderConfig={codec:c,codedWidth:this.codecContext.width,codedHeight:this.codecContext.height,displayAspectWidth:this.config.displayWidth??this.codecContext.width,displayAspectHeight:this.config.displayHeight??this.codecContext.height,description:d??void 0,colorSpace:{primaries:ae(this.codecContext.colorPrimaries),matrix:le(this.codecContext.colorSpace),transfer:ce(this.codecContext.colorTrc),fullRange:this.codecContext.colorRange===u.AVCOL_RANGE_JPEG?!0:this.codecContext.colorRange===u.AVCOL_RANGE_MPEG?!1:void 0}}),this.packetEmitted=!0,this.onPacket(F,m)}async flush(){if(this.codecContext){let r=await this.codecContext.sendFrame(null);for(u.FFmpegError.throwIfError(r,"Send frame");;){let n=await this.codecContext.receivePacket(this.packet);if(n===u.AVERROR_EAGAIN||n===u.AVERROR_EOF)break;this.receivePacket(n)}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 qt,CustomAudioDecoder as Wt}from"mediabunny";import*as I from"node-av";import{AudioSampleResource as Ht}from"mediabunny";import*as ne from"node-av";var K=class extends Ht{get frame(){if(!this._frame)throw new Error("AvFrameAudioSampleResource has been closed.");return this._frame}constructor(e){if(super(),!(e instanceof ne.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(e.getMediaType()!==ne.AVMEDIA_TYPE_AUDIO)throw new Error("AvFrameAudioSampleResource must be initialized with an audio frame.");this._frame=e}getFormat(){let e=De(this.frame.format);if(e===null){let r=ne.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 f(this.frame.data&&e<this.frame.data.length),k(this.frame.data[e])}},he=(t,e)=>{e.format=ze(t.format),e.nbSamples=t.numberOfFrames,e.sampleRate=t.sampleRate,e.channelLayout=J(t.numberOfChannels),e.allocBuffer(),f(e.data);for(let r=0;r<e.data.length;r++)t.copyTo(e.data[r],{planeIndex:r})};var ge=class extends Wt{constructor(){super(...arguments);this.codecContext=null}static supports(r,n){return r==="aac"||r==="opus"||r==="mp3"||r==="vorbis"||r==="flac"||r==="ac3"||r==="eac3"||r==="dts"}async init(){this.frame=new I.Frame,this.frame.alloc(),this.packet=new I.Packet,this.packet.alloc();let r=Y[this.codec];f(r!==void 0);let n=I.Codec.findDecoder(r);if(n===null)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);let o=new I.CodecContext;o.allocContext3(n),o.sampleRate=this.config.sampleRate,o.channelLayout=J(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(k(this.config.description)):null;let s=await o.open2();I.FFmpegError.throwIfError(s,"Open codec context"),this.codecContext=o}async decode(r){f(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 n=await this.codecContext.sendPacket(this.packet);for(I.FFmpegError.throwIfError(n,"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 n=this.frame.clone();if(!n)throw new Error("Allocation failure during frame clone.");n.timeBase=new I.Rational(1,this.config.sampleRate),this.onSample(new qt(new K(n)))}async flush(){f(this.codecContext);let r=await this.codecContext.sendPacket(null);for(I.FFmpegError.throwIfError(r,"Flush decoder");;){let n=await this.codecContext.receiveFrame(this.frame);if(n===I.AVERROR_EAGAIN||n===I.AVERROR_EOF)break;this.receiveFrame(n)}this.codecContext.flushBuffers()}close(){this.codecContext?.freeContext(),this.frame.free(),this.packet.free()}};import{CustomAudioEncoder as Gt,Quality as Yt,EncodedPacket as Kt}from"mediabunny";import*as v from"node-av";var ct=[8e3,11025,12e3,16e3,22050,24e3,32e3,44100,48e3],lt=[1,2,4,5,6],Xt=16384,dt=(t,e,r)=>{if(t<32e3||t>384e4)return!1;let n=r===6,o=r-(n?1:0),s=32*Math.ceil(Math.ceil(t*512/e)/32),a=132+(493+28*32)*o+(n?72:0);return s>=a&&s<=8*Xt};var Qt=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],$t=[8e3,12e3,16e3,24e3,48e3],Jt=[8e3,11025,12e3,16e3,22050,24e3,32e3,44100,48e3],At=[32e3,44100,48e3],Fe=1024,Ce=class extends Gt{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,n){let{numberOfChannels:o,sampleRate:s}=n;return r==="aac"&&o>=1&&o<=48&&Qt.includes(s)||r==="opus"&&o>=1&&o<=255&&$t.includes(s)||r==="mp3"&&o>=1&&o<=2&&Jt.includes(s)||r==="vorbis"&&o>=1&&o<=255&&s<=2e5||r==="flac"&&o>=1&&o<=8&&s<=655350||r==="ac3"&&o>=1&&o<=6&&At.includes(s)||r==="eac3"&&o>=1&&o<=16&&At.includes(s)||r==="dts"&&lt.includes(o)&&ct.includes(s)&&dt(ut(n,r),s,o)}async init(){this.frame=new v.Frame,this.frame.alloc(),this.packet=new v.Packet,this.packet.alloc();let r=Y[this.codec];f(r!==void 0);let n=v.Codec.findEncoder(r);if(!n)throw new Error(`Unable to obtain libav codec for '${this.codec}'.`);this.avCodec=n,await this.createCodecContext()}async createCodecContext(){f(this.codecContext===null);let r=new v.CodecContext;r.allocContext3(this.avCodec);let n=v.AV_SAMPLE_FMT_FLTP;this.avCodec.sampleFormats&&!this.avCodec.sampleFormats.includes(v.AV_SAMPLE_FMT_FLTP)&&(n=this.avCodec.sampleFormats[0]),r.sampleRate=this.config.sampleRate,r.channelLayout=this.codec==="dts"?He(this.config.numberOfChannels):J(this.config.numberOfChannels),r.codecType=v.AVMEDIA_TYPE_AUDIO,r.codecId=Y[this.codec],r.sampleFormat=n,r.timeBase=new v.Rational(1,this.config.sampleRate),r.bitRate=BigInt(ut(this.config,this.codec)),this.config.bitrateMode==="constant"&&(r.rcMinRate=r.bitRate,r.rcMaxRate=r.bitRate);let o=this.codec==="dts"?v.Dictionary.fromObject({strict:-2}):null,s=await r.open2(this.avCodec,o);v.FFmpegError.throwIfError(s,"Open codec context"),this.codecContext=r}async encode(r){this.codecContext===null&&(await this.createCodecContext(),f(this.codecContext)),this.firstExpectedTimestamp??=r.timestamp,r._data instanceof K?(this.frame.unref(),this.frame.ref(r._data.frame)):he(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 n=`${this.frame.sampleRate}:${this.frame.channels}:${this.frame.format}`;if(this.inputParametersKey!==null&&this.inputParametersKey!==n)throw new Error("Input audio parameters changed. For this audio encoder, you cannot change the input audio parameters over time.");if(this.inputParametersKey=n,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=this.codecContext.channelLayout,l=J(this.frame.channels),m=this.resampler.allocSetOpts2(a,this.codecContext.sampleFormat,this.codecContext.sampleRate,l,this.frame.format,this.frame.sampleRate);v.FFmpegError.throwIfError(m,"allocSetOpts2");let c=this.resampler.init();v.FFmpegError.throwIfError(c,"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||Fe,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(){f(this.codecContext),f(this.resampler),f(this.dstFrame),f(this.nextResamplerPts!==null);let r=this.codecContext.frameSize||Fe;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){f(this.codecContext);let n=await this.codecContext.sendFrame(r);for(v.FFmpegError.throwIfError(n,"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(f(this.codecContext),f(this.firstExpectedTimestamp!==null),v.FFmpegError.throwIfError(r,"Receive packet"),!this.packet.data)return;let n=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-n,0);let m=this.config.codec,c=this.codecContext.extraData?k(this.codecContext.extraData):void 0;if(this.codec==="aac"){if(!c)throw new Error("Extradata expected for AAC.");if(this.config.aac?.format==="adts"){let h=Qe(c);this.adtsHeaderTemplate=$e(h),c=void 0}}else if(this.codec==="opus"){if(!c)throw new Error("Extradata expected for Opus.")}else if(this.codec==="vorbis"){if(!c)throw new Error("Extradata expected for Vorbis.")}else if(this.codec==="flac"){if(!c)throw new Error("Extradata expected for FLAC.");c=new Uint8Array([102,76,97,67,128,0,0,c.byteLength,...c])}a={decoderConfig:{codec:m,sampleRate:this.codecContext.sampleRate,numberOfChannels:this.codecContext.channels,description:c}}}if(this.adtsHeaderTemplate){let m=s.byteLength+this.adtsHeaderTemplate.header.byteLength;this.adtsHeaderTemplate.bitstream.pos=30,this.adtsHeaderTemplate.bitstream.writeBits(13,m);let c=new Uint8Array(this.adtsHeaderTemplate.header.byteLength+s.byteLength);c.set(this.adtsHeaderTemplate.header,0),c.set(s,this.adtsHeaderTemplate.header.byteLength),s=c}n+=this.outputTimestampOffset;let l=new Kt(s,"key",n,o);this.packetEmitted=!0,this.onPacket(l,a)}async flush(){if(this.codecContext){e:if(this.resampler){f(this.resamplerInputSampleRate!==null);let r=this.resampler.getOutSamples(0);if(r===0)break e;let n=this.codecContext.frameSize||Fe;f(r<n);let o=Math.ceil((n-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()}},ut=(t,e)=>t.bitrate??new Yt("medium")._toAudioBitrate(e)??0;import{registerProresDecoder as tr}from"@mediabunny/prores";var gt=Symbol.for("@mediabunny/server loaded");globalThis[gt]&&Zt._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[gt]=!0;var ht=!1,G={},Yn=(t={})=>{if(typeof t!="object"||!t)throw new TypeError("options must be an object.");if(t.hardwareContext!=null&&!(t.hardwareContext instanceof q.HardwareContext||typeof t.hardwareContext=="function"))throw new TypeError("options.hardwareContext, when provided, must be a NodeAv.HardwareContext, a function, or null.");ht||(ht=!0,G=t,q.Log.setLevel(q.AV_LOG_ERROR),mt(ue),tr(),ft(pe),mt(ge),ft(Ce),er(Ye))},Kn=async(t,e)=>{if(!(t instanceof pt)&&!(t instanceof jt))throw new TypeError("sample must be a VideoSample or an AudioSample.");if(!(e instanceof q.Frame))throw new TypeError("frame must be a NodeAv.Frame.");if(t instanceof pt){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 oe(t,e,null)}e.pts=BigInt(t.microsecondTimestamp),e.duration=BigInt(t.microsecondDuration),e.timeBase=new q.Rational(1,1e6)}else t._data instanceof K?(e.unref(),e.ref(t._data.frame)):he(t,e),e.timeBase=new q.Rational(1,t.sampleRate),e.pts=BigInt(Math.round(t.timestamp*t.sampleRate)),e.duration=BigInt(t.numberOfFrames)};export{K as AvFrameAudioSampleResource,H as AvFrameVideoSampleResource,G as _serverOptions,Yn as registerMediabunnyServer,Kn as toAvFrame};
@@ -36,7 +36,8 @@ var CODEC_TO_CODEC_ID = {
36
36
  vorbis: NodeAv.AV_CODEC_ID_VORBIS,
37
37
  flac: NodeAv.AV_CODEC_ID_FLAC,
38
38
  ac3: NodeAv.AV_CODEC_ID_AC3,
39
- eac3: NodeAv.AV_CODEC_ID_EAC3
39
+ eac3: NodeAv.AV_CODEC_ID_EAC3,
40
+ dts: NodeAv.AV_CODEC_ID_DTS
40
41
  };
41
42
  var cachedHardwareContext = void 0;
42
43
  var getHardwareContext = () => {
@@ -344,6 +345,23 @@ var getChannelLayout = (numChannels) => {
344
345
  return { nbChannels: numChannels, order: NodeAv.AV_CHANNEL_ORDER_UNSPEC, mask: 0n };
345
346
  }
346
347
  };
348
+ var QUAD_SIDE_MASK = 0x603n;
349
+ var getDtsChannelLayout = (numChannels) => {
350
+ switch (numChannels) {
351
+ case 1:
352
+ return NodeAv.AV_CHANNEL_LAYOUT_MONO;
353
+ case 2:
354
+ return NodeAv.AV_CHANNEL_LAYOUT_STEREO;
355
+ case 4:
356
+ return { nbChannels: 4, order: NodeAv.AV_CHANNEL_ORDER_NATIVE, mask: QUAD_SIDE_MASK };
357
+ case 5:
358
+ return NodeAv.AV_CHANNEL_LAYOUT_5POINT0;
359
+ case 6:
360
+ return NodeAv.AV_CHANNEL_LAYOUT_5POINT1;
361
+ default:
362
+ return { nbChannels: numChannels, order: NodeAv.AV_CHANNEL_ORDER_UNSPEC, mask: 0n };
363
+ }
364
+ };
347
365
 
348
366
  // src/logging.ts
349
367
  var _Logging = class _Logging {
@@ -1084,7 +1102,8 @@ var NON_PCM_AUDIO_CODECS = [
1084
1102
  "vorbis",
1085
1103
  "flac",
1086
1104
  "ac3",
1087
- "eac3"
1105
+ "eac3",
1106
+ "dts"
1088
1107
  ];
1089
1108
  var AUDIO_CODECS = [
1090
1109
  ...NON_PCM_AUDIO_CODECS,
@@ -3203,7 +3222,7 @@ var NodeAvAudioDecoder = class extends CustomAudioDecoder {
3203
3222
  }
3204
3223
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3205
3224
  static supports(codec, config) {
3206
- return codec === "aac" || codec === "opus" || codec === "mp3" || codec === "vorbis" || codec === "flac" || codec === "ac3" || codec === "eac3";
3225
+ return codec === "aac" || codec === "opus" || codec === "mp3" || codec === "vorbis" || codec === "flac" || codec === "ac3" || codec === "eac3" || codec === "dts";
3207
3226
  }
3208
3227
  async init() {
3209
3228
  this.frame = new NodeAv6.Frame();
@@ -3283,6 +3302,23 @@ import {
3283
3302
  EncodedPacket as EncodedPacket4
3284
3303
  } from "mediabunny";
3285
3304
  import * as NodeAv7 from "node-av";
3305
+
3306
+ // shared/dts-misc.ts
3307
+ var DTS_SAMPLE_RATES = [8e3, 11025, 12e3, 16e3, 22050, 24e3, 32e3, 44100, 48e3];
3308
+ var DTS_CHANNEL_COUNTS = [1, 2, 4, 5, 6];
3309
+ var DTS_MAX_FRAME_SIZE = 16384;
3310
+ var dtsBitrateFits = (bitrate, sampleRate, numberOfChannels) => {
3311
+ if (bitrate < 32e3 || bitrate > 384e4) {
3312
+ return false;
3313
+ }
3314
+ const hasLfe = numberOfChannels === 6;
3315
+ const fullbandChannels = numberOfChannels - (hasLfe ? 1 : 0);
3316
+ const frameBits = 32 * Math.ceil(Math.ceil(bitrate * 512 / sampleRate) / 32);
3317
+ const minFrameBits = 132 + (493 + 28 * 32) * fullbandChannels + (hasLfe ? 72 : 0);
3318
+ return frameBits >= minFrameBits && frameBits <= 8 * DTS_MAX_FRAME_SIZE;
3319
+ };
3320
+
3321
+ // packages/server/src/audio-encoder.ts
3286
3322
  var AAC_SAMPLE_RATES = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];
3287
3323
  var OPUS_SAMPLE_RATES = [8e3, 12e3, 16e3, 24e3, 48e3];
3288
3324
  var MP3_SAMPLE_RATES = [8e3, 11025, 12e3, 16e3, 22050, 24e3, 32e3, 44100, 48e3];
@@ -3304,7 +3340,7 @@ var NodeAvAudioEncoder = class extends CustomAudioEncoder {
3304
3340
  }
3305
3341
  static supports(codec, config) {
3306
3342
  const { numberOfChannels, sampleRate } = config;
3307
- return codec === "aac" && numberOfChannels >= 1 && numberOfChannels <= 48 && AAC_SAMPLE_RATES.includes(sampleRate) || codec === "opus" && numberOfChannels >= 1 && numberOfChannels <= 255 && OPUS_SAMPLE_RATES.includes(sampleRate) || codec === "mp3" && numberOfChannels >= 1 && numberOfChannels <= 2 && MP3_SAMPLE_RATES.includes(sampleRate) || codec === "vorbis" && numberOfChannels >= 1 && numberOfChannels <= 255 && sampleRate <= 2e5 || codec === "flac" && numberOfChannels >= 1 && numberOfChannels <= 8 && sampleRate <= 655350 || codec === "ac3" && numberOfChannels >= 1 && numberOfChannels <= 6 && AC3_SAMPLE_RATES.includes(sampleRate) || codec === "eac3" && numberOfChannels >= 1 && numberOfChannels <= 16 && AC3_SAMPLE_RATES.includes(sampleRate);
3343
+ return codec === "aac" && numberOfChannels >= 1 && numberOfChannels <= 48 && AAC_SAMPLE_RATES.includes(sampleRate) || codec === "opus" && numberOfChannels >= 1 && numberOfChannels <= 255 && OPUS_SAMPLE_RATES.includes(sampleRate) || codec === "mp3" && numberOfChannels >= 1 && numberOfChannels <= 2 && MP3_SAMPLE_RATES.includes(sampleRate) || codec === "vorbis" && numberOfChannels >= 1 && numberOfChannels <= 255 && sampleRate <= 2e5 || codec === "flac" && numberOfChannels >= 1 && numberOfChannels <= 8 && sampleRate <= 655350 || codec === "ac3" && numberOfChannels >= 1 && numberOfChannels <= 6 && AC3_SAMPLE_RATES.includes(sampleRate) || codec === "eac3" && numberOfChannels >= 1 && numberOfChannels <= 16 && AC3_SAMPLE_RATES.includes(sampleRate) || codec === "dts" && DTS_CHANNEL_COUNTS.includes(numberOfChannels) && DTS_SAMPLE_RATES.includes(sampleRate) && dtsBitrateFits(resolveBitrate(config, codec), sampleRate, numberOfChannels);
3308
3344
  }
3309
3345
  async init() {
3310
3346
  this.frame = new NodeAv7.Frame();
@@ -3329,19 +3365,18 @@ var NodeAvAudioEncoder = class extends CustomAudioEncoder {
3329
3365
  sampleFormat = this.avCodec.sampleFormats[0];
3330
3366
  }
3331
3367
  codecContext.sampleRate = this.config.sampleRate;
3332
- codecContext.channelLayout = getChannelLayout(this.config.numberOfChannels);
3368
+ codecContext.channelLayout = this.codec === "dts" ? getDtsChannelLayout(this.config.numberOfChannels) : getChannelLayout(this.config.numberOfChannels);
3333
3369
  codecContext.codecType = NodeAv7.AVMEDIA_TYPE_AUDIO;
3334
3370
  codecContext.codecId = CODEC_TO_CODEC_ID[this.codec];
3335
3371
  codecContext.sampleFormat = sampleFormat;
3336
3372
  codecContext.timeBase = new NodeAv7.Rational(1, this.config.sampleRate);
3337
- codecContext.bitRate = BigInt(
3338
- this.config.bitrate ?? new Quality2("medium")._toAudioBitrate(this.codec) ?? 0
3339
- );
3373
+ codecContext.bitRate = BigInt(resolveBitrate(this.config, this.codec));
3340
3374
  if (this.config.bitrateMode === "constant") {
3341
3375
  codecContext.rcMinRate = codecContext.bitRate;
3342
3376
  codecContext.rcMaxRate = codecContext.bitRate;
3343
3377
  }
3344
- const ret = await codecContext.open2();
3378
+ const options = this.codec === "dts" ? NodeAv7.Dictionary.fromObject({ strict: -2 }) : null;
3379
+ const ret = await codecContext.open2(this.avCodec, options);
3345
3380
  NodeAv7.FFmpegError.throwIfError(ret, "Open codec context");
3346
3381
  this.codecContext = codecContext;
3347
3382
  }
@@ -3372,7 +3407,7 @@ var NodeAvAudioEncoder = class extends CustomAudioEncoder {
3372
3407
  if (!this.resampler) {
3373
3408
  this.resampler = new NodeAv7.SoftwareResampleContext();
3374
3409
  this.resamplerInputSampleRate = this.frame.sampleRate;
3375
- const outLayout = getChannelLayout(this.codecContext.channels);
3410
+ const outLayout = this.codecContext.channelLayout;
3376
3411
  const inLayout = getChannelLayout(this.frame.channels);
3377
3412
  const ret = this.resampler.allocSetOpts2(
3378
3413
  outLayout,
@@ -3556,6 +3591,9 @@ var NodeAvAudioEncoder = class extends CustomAudioEncoder {
3556
3591
  this.resampler?.free();
3557
3592
  }
3558
3593
  };
3594
+ var resolveBitrate = (config, codec) => {
3595
+ return config.bitrate ?? new Quality2("medium")._toAudioBitrate(codec) ?? 0;
3596
+ };
3559
3597
 
3560
3598
  // packages/server/src/index.ts
3561
3599
  import { registerProresDecoder } from "@mediabunny/prores";
@@ -1 +1 @@
1
- {"version":3,"file":"audio-decoder.d.ts","sourceRoot":"","sources":["../../../src/audio-decoder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAe,kBAAkB,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAKlC,qBAAa,kBAAmB,SAAQ,kBAAkB;IACzD,KAAK,EAAG,MAAM,CAAC,KAAK,CAAC;IACrB,MAAM,EAAG,MAAM,CAAC,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAQ;WAGhC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO;IAU1E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCrB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBlD,YAAY,CAAC,GAAG,EAAE,MAAM;IAYlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;CAK3B"}
1
+ {"version":3,"file":"audio-decoder.d.ts","sourceRoot":"","sources":["../../../src/audio-decoder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAe,kBAAkB,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAKlC,qBAAa,kBAAmB,SAAQ,kBAAkB;IACzD,KAAK,EAAG,MAAM,CAAC,KAAK,CAAC;IACrB,MAAM,EAAG,MAAM,CAAC,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAQ;WAGhC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO;IAW1E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCrB,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBlD,YAAY,CAAC,GAAG,EAAE,MAAM;IAYlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB5B,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;CAK3B"}
@@ -59,7 +59,8 @@ class NodeAvAudioDecoder extends mediabunny_1.CustomAudioDecoder {
59
59
  || codec === 'vorbis'
60
60
  || codec === 'flac'
61
61
  || codec === 'ac3'
62
- || codec === 'eac3';
62
+ || codec === 'eac3'
63
+ || codec === 'dts';
63
64
  }
64
65
  async init() {
65
66
  this.frame = new NodeAv.Frame();
@@ -1 +1 @@
1
- {"version":3,"file":"audio-encoder.d.ts","sourceRoot":"","sources":["../../../src/audio-encoder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,KAAK,YAAY,EAGjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAIlC,OAAO,EACN,kBAAkB,EAGlB,MAAM,0BAA0B,CAAC;AAUlC,qBAAa,kBAAmB,SAAQ,kBAAkB;IACzD,KAAK,EAAG,MAAM,CAAC,KAAK,CAAC;IACrB,MAAM,EAAG,MAAM,CAAC,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAQ;IAChD,SAAS,EAAE,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAQ;IACxD,QAAQ,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAQ;IACrC,OAAO,EAAG,MAAM,CAAC,KAAK,CAAC;IACvB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7C,qBAAqB,SAAK;IAE1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,aAAa,UAAS;IACtB,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;WAErC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO;IA2B1E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrB,kBAAkB;IAiClB,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF/C,mBAAmB;IAuBnB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI;IAgB3D,aAAa,CAAC,GAAG,EAAE,MAAM;IAsGnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;CAO3B"}
1
+ {"version":3,"file":"audio-encoder.d.ts","sourceRoot":"","sources":["../../../src/audio-encoder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,KAAK,YAAY,EAGjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAIlC,OAAO,EACN,kBAAkB,EAGlB,MAAM,0BAA0B,CAAC;AAWlC,qBAAa,kBAAmB,SAAQ,kBAAkB;IACzD,KAAK,EAAG,MAAM,CAAC,KAAK,CAAC;IACrB,MAAM,EAAG,MAAM,CAAC,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAQ;IAChD,SAAS,EAAE,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAQ;IACxD,QAAQ,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAQ;IACrC,OAAO,EAAG,MAAM,CAAC,KAAK,CAAC;IACvB,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7C,qBAAqB,SAAK;IAE1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACzC,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,aAAa,UAAS;IACtB,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAQ;WAErC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO;IA+B1E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBrB,kBAAkB;IAsClB,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmF/C,mBAAmB;IAuBnB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,IAAI;IAgB3D,aAAa,CAAC,GAAG,EAAE,MAAM;IAsGnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC;CAO3B"}
@@ -47,6 +47,7 @@ const misc_1 = require("./misc");
47
47
  const misc_2 = require("../../../src/misc");
48
48
  const audio_sample_1 = require("./audio-sample");
49
49
  const aac_misc_1 = require("../../../shared/aac-misc");
50
+ const dts_misc_1 = require("../../../shared/dts-misc");
50
51
  const AAC_SAMPLE_RATES = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
51
52
  const OPUS_SAMPLE_RATES = [8000, 12000, 16000, 24000, 48000];
52
53
  const MP3_SAMPLE_RATES = [8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000];
@@ -75,7 +76,9 @@ class NodeAvAudioEncoder extends mediabunny_1.CustomAudioEncoder {
75
76
  && sampleRate <= 200000) || (codec === 'flac' && numberOfChannels >= 1 && numberOfChannels <= 8
76
77
  && sampleRate <= 655350) || (codec === 'ac3' && numberOfChannels >= 1 && numberOfChannels <= 6
77
78
  && AC3_SAMPLE_RATES.includes(sampleRate)) || (codec === 'eac3' && numberOfChannels >= 1 && numberOfChannels <= 16
78
- && AC3_SAMPLE_RATES.includes(sampleRate));
79
+ && AC3_SAMPLE_RATES.includes(sampleRate)) || (codec === 'dts' && dts_misc_1.DTS_CHANNEL_COUNTS.includes(numberOfChannels)
80
+ && dts_misc_1.DTS_SAMPLE_RATES.includes(sampleRate)
81
+ && (0, dts_misc_1.dtsBitrateFits)(resolveBitrate(config, codec), sampleRate, numberOfChannels));
79
82
  }
80
83
  async init() {
81
84
  this.frame = new NodeAv.Frame();
@@ -101,17 +104,23 @@ class NodeAvAudioEncoder extends mediabunny_1.CustomAudioEncoder {
101
104
  sampleFormat = this.avCodec.sampleFormats[0];
102
105
  }
103
106
  codecContext.sampleRate = this.config.sampleRate;
104
- codecContext.channelLayout = (0, misc_1.getChannelLayout)(this.config.numberOfChannels);
107
+ codecContext.channelLayout = this.codec === 'dts'
108
+ ? (0, misc_1.getDtsChannelLayout)(this.config.numberOfChannels)
109
+ : (0, misc_1.getChannelLayout)(this.config.numberOfChannels);
105
110
  codecContext.codecType = NodeAv.AVMEDIA_TYPE_AUDIO;
106
111
  codecContext.codecId = misc_1.CODEC_TO_CODEC_ID[this.codec];
107
112
  codecContext.sampleFormat = sampleFormat;
108
113
  codecContext.timeBase = new NodeAv.Rational(1, this.config.sampleRate);
109
- codecContext.bitRate = BigInt(this.config.bitrate ?? new mediabunny_1.Quality('medium')._toAudioBitrate(this.codec) ?? 0);
114
+ codecContext.bitRate = BigInt(resolveBitrate(this.config, this.codec));
110
115
  if (this.config.bitrateMode === 'constant') {
111
116
  codecContext.rcMinRate = codecContext.bitRate;
112
117
  codecContext.rcMaxRate = codecContext.bitRate;
113
118
  }
114
- const ret = await codecContext.open2();
119
+ // libav's DTS encoder is marked experimental, so it refuses to open at the default compliance level
120
+ const options = this.codec === 'dts'
121
+ ? NodeAv.Dictionary.fromObject({ strict: -2 })
122
+ : null;
123
+ const ret = await codecContext.open2(this.avCodec, options);
115
124
  NodeAv.FFmpegError.throwIfError(ret, 'Open codec context');
116
125
  this.codecContext = codecContext;
117
126
  }
@@ -151,7 +160,9 @@ class NodeAvAudioEncoder extends mediabunny_1.CustomAudioEncoder {
151
160
  if (!this.resampler) {
152
161
  this.resampler = new NodeAv.SoftwareResampleContext();
153
162
  this.resamplerInputSampleRate = this.frame.sampleRate;
154
- const outLayout = (0, misc_1.getChannelLayout)(this.codecContext.channels);
163
+ // Resample straight to whatever layout the encoder was opened with, since not every codec accepts
164
+ // the layout that getChannelLayout hands out for a given channel count
165
+ const outLayout = this.codecContext.channelLayout;
155
166
  const inLayout = (0, misc_1.getChannelLayout)(this.frame.channels);
156
167
  const ret = this.resampler.allocSetOpts2(outLayout, this.codecContext.sampleFormat, this.codecContext.sampleRate, inLayout, this.frame.format, this.frame.sampleRate);
157
168
  NodeAv.FFmpegError.throwIfError(ret, 'allocSetOpts2');
@@ -331,3 +342,6 @@ class NodeAvAudioEncoder extends mediabunny_1.CustomAudioEncoder {
331
342
  }
332
343
  }
333
344
  exports.NodeAvAudioEncoder = NodeAvAudioEncoder;
345
+ const resolveBitrate = (config, codec) => {
346
+ return config.bitrate ?? new mediabunny_1.Quality('medium')._toAudioBitrate(codec) ?? 0;
347
+ };
@@ -22,4 +22,9 @@ export declare const fromPixelFormat: (pixelFormat: VideoSamplePixelFormat) => N
22
22
  export declare const toAudioSampleFormat: (ffmpegSampleFormat: NodeAv.AVSampleFormat) => AudioSampleFormat | null;
23
23
  export declare const fromAudioSampleFormat: (sampleFormat: AudioSampleFormat) => NodeAv.AVSampleFormat;
24
24
  export declare const getChannelLayout: (numChannels: number) => NodeAv.ChannelLayout;
25
+ /**
26
+ * DTS insists on the side-based surround layouts and rejects the back-based ones that {@link getChannelLayout}
27
+ * hands out, so it gets its own mapping.
28
+ */
29
+ export declare const getDtsChannelLayout: (numChannels: number) => NodeAv.ChannelLayout;
25
30
  //# sourceMappingURL=misc.d.ts.map
@@ -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;AAGlC,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAe3E,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"}
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,CAgB3E,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;AAKF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,aAAa,MAAM,KAAG,MAAM,CAAC,aAShE,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.getChannelLayout = exports.fromAudioSampleFormat = exports.toAudioSampleFormat = exports.fromPixelFormat = exports.toPixelFormat = exports.unmapMatrixCoefficients = exports.mapMatrixCoefficients = exports.unmapTransferCharacteristics = exports.mapTransferCharacteristics = exports.unmapColorPrimaries = exports.mapColorPrimaries = exports.getHardwareEncoderCodec = exports.getHardwareDecoderCodec = exports.getHardwareContext = exports.CODEC_TO_CODEC_ID = void 0;
43
+ exports.getDtsChannelLayout = exports.getChannelLayout = exports.fromAudioSampleFormat = exports.toAudioSampleFormat = exports.fromPixelFormat = exports.toPixelFormat = exports.unmapMatrixCoefficients = exports.mapMatrixCoefficients = exports.unmapTransferCharacteristics = exports.mapTransferCharacteristics = exports.unmapColorPrimaries = exports.mapColorPrimaries = exports.getHardwareEncoderCodec = exports.getHardwareDecoderCodec = exports.getHardwareContext = exports.CODEC_TO_CODEC_ID = void 0;
44
44
  const NodeAv = __importStar(require("node-av"));
45
45
  const index_1 = require("./index");
46
46
  exports.CODEC_TO_CODEC_ID = {
@@ -57,6 +57,7 @@ exports.CODEC_TO_CODEC_ID = {
57
57
  flac: NodeAv.AV_CODEC_ID_FLAC,
58
58
  ac3: NodeAv.AV_CODEC_ID_AC3,
59
59
  eac3: NodeAv.AV_CODEC_ID_EAC3,
60
+ dts: NodeAv.AV_CODEC_ID_DTS,
60
61
  };
61
62
  let cachedHardwareContext = undefined;
62
63
  const getHardwareContext = () => {
@@ -273,3 +274,20 @@ const getChannelLayout = (numChannels) => {
273
274
  }
274
275
  };
275
276
  exports.getChannelLayout = getChannelLayout;
277
+ /** FL + FR + SL + SR, which libav has no constant for. */
278
+ const QUAD_SIDE_MASK = 0x603n;
279
+ /**
280
+ * DTS insists on the side-based surround layouts and rejects the back-based ones that {@link getChannelLayout}
281
+ * hands out, so it gets its own mapping.
282
+ */
283
+ const getDtsChannelLayout = (numChannels) => {
284
+ switch (numChannels) {
285
+ case 1: return NodeAv.AV_CHANNEL_LAYOUT_MONO;
286
+ case 2: return NodeAv.AV_CHANNEL_LAYOUT_STEREO;
287
+ case 4: return { nbChannels: 4, order: NodeAv.AV_CHANNEL_ORDER_NATIVE, mask: QUAD_SIDE_MASK };
288
+ case 5: return NodeAv.AV_CHANNEL_LAYOUT_5POINT0;
289
+ case 6: return NodeAv.AV_CHANNEL_LAYOUT_5POINT1;
290
+ default: return { nbChannels: numChannels, order: NodeAv.AV_CHANNEL_ORDER_UNSPEC, mask: 0n };
291
+ }
292
+ };
293
+ exports.getDtsChannelLayout = getDtsChannelLayout;