@mediabunny/server 1.54.0 → 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.
- package/dist/bundles/mediabunny-server.cjs +48 -10
- package/dist/bundles/mediabunny-server.min.cjs +2 -2
- package/dist/bundles/mediabunny-server.min.mjs +2 -2
- package/dist/bundles/mediabunny-server.mjs +48 -10
- package/dist/modules/src/audio-decoder.d.ts.map +1 -1
- package/dist/modules/src/audio-decoder.js +2 -1
- package/dist/modules/src/audio-encoder.d.ts.map +1 -1
- package/dist/modules/src/audio-encoder.js +19 -5
- package/dist/modules/src/misc.d.ts +5 -0
- package/dist/modules/src/misc.d.ts.map +1 -1
- package/dist/modules/src/misc.js +19 -1
- package/dist/modules/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/audio-decoder.ts +2 -1
- package/src/audio-encoder.ts +23 -7
- package/src/misc.ts +19 -0
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
6
6
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
7
7
|
*/
|
|
8
|
-
import{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[
|
|
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"&<.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
|
|
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 =
|
|
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;
|
|
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;
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/modules/src/misc.js
CHANGED
|
@@ -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;
|