@lumen5/framefusion 0.0.4 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -42,7 +42,7 @@ async function run() {
42
42
  });
43
43
 
44
44
  // Get frame at a specific time (in seconds)
45
- const imageData = await extractor.getFrameImageDataAtTime(2.0);
45
+ const imageData = await extractor.getImageDataAtTime(2.0);
46
46
 
47
47
  // Do something with frame data
48
48
  console.log(imageData);
@@ -1,2 +1,2 @@
1
- "use strict";var re=Object.defineProperty;var se=(i,s,e)=>s in i?re(i,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[s]=e;var u=(i,s,e)=>(se(i,typeof s!="symbol"?s+"":s,e),e),O=(i,s,e)=>{if(!s.has(i))throw TypeError("Cannot "+e)};var m=(i,s,e)=>(O(i,s,"read from private field"),e?e.call(i):s.get(i)),c=(i,s,e)=>{if(s.has(i))throw TypeError("Cannot add the same private member more than once");s instanceof WeakSet?s.add(i):s.set(i,e)},d=(i,s,e,t)=>(O(i,s,"write to private field"),t?t.call(i,e):s.set(i,e),e);var h=(i,s,e)=>(O(i,s,"access private method"),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("beamcoder"),ie=require("canvas"),ae=require("path"),ne=require("node:https"),oe=require("http"),ce=require("tmp"),he=require("fs-extra");class me{static async create(s){throw new Error("Not implemented")}async init({inputFileOrUrl:s,outputFile:e,threadCount:t=8,endTime:r,interpolateFps:a,interpolateMode:o}){throw new Error("Not implemented")}get duration(){throw new Error("Not implemented")}get width(){throw new Error("Not implemented")}get height(){throw new Error("Not implemented")}async seekToPTS(s){throw new Error("Not implemented")}async getFrameAtTime(s){throw new Error("Not implemented")}async getFrameAtPts(s){throw new Error("Not implemented")}async seekToTime(s){throw new Error("Not implemented")}ptsToTime(s){throw new Error("Not implemented")}async readFrames({onFrameAvailable:s,flush:e=!0}={flush:!0,onFrameAvailable:()=>!0}){throw new Error("Not implemented")}async dispose(){throw new Error("Not implemented")}}class le extends Error{}var x,F,k,y;class de{constructor(s){c(this,x,void 0);c(this,F,void 0);c(this,k,void 0);c(this,y,void 0);d(this,x,s)}get filepath(){return m(this,k)}async download(){await new Promise((s,e)=>{const t=m(this,x),r=ae.extname(t);d(this,y,ce.fileSync({postfix:r}));try{const a=t.startsWith("https://")?ne:oe;d(this,F,a.get(t,o=>{const n=o.headers["content-type"];if(!n.includes("video")){const f=new Error(`Source ${t}, returned unsupported content type ${n}`);e(f);return}const w=he.createWriteStream(m(this,y).name);o.pipe(w),w.on("finish",()=>{w.close(),d(this,k,m(this,y).name),s()}),w.on("error",f=>{e(f)})})),m(this,F).on("error",o=>{o instanceof le||e(o)})}catch(a){e(a)}})}clear(){m(this,y)&&m(this,y).removeCallback(),m(this,x)&&d(this,x,void 0),m(this,F)&&d(this,F,null),m(this,k)&&d(this,k,void 0)}}x=new WeakMap,F=new WeakMap,k=new WeakMap,y=new WeakMap;const ue=async({stream:i,outputPixelFormat:s,interpolateFps:e,interpolateMode:t="fast"})=>{if(!i.codecpar.format)return null;let r=[`[in0:v]format=${i.codecpar.format}`];if(e)if(t==="high-quality")r=[...r,`minterpolate=fps=${e}`];else if(t==="fast")r=[...r,`fps=${e}`];else throw new Error(`Unexpected interpolation mode: ${t}`);r=[...r];const a=r.join(", ")+"[out0:v]";return console.log(`filterSpec: ${a}`),b.filterer({filterType:"video",inputParams:[{name:"in0:v",width:i.codecpar.width,height:i.codecpar.height,pixelFormat:i.codecpar.format,timeBase:i.time_base,pixelAspect:i.sample_aspect_ratio}],outputParams:[{name:"out0:v",pixelFormat:s}],filterSpec:a})};var S,E,v,M,A,B,T,_,N,H,j,U,D,K,q,V,R,Y,L,X,$,G,I,Z,W,ee;const J=class extends me{constructor(){super(...arguments);c(this,A);c(this,T);c(this,N);c(this,j);c(this,D);c(this,q);c(this,R);c(this,L);c(this,$);c(this,I);c(this,W);u(this,"decoder",null);u(this,"demuxer",null);u(this,"encoder",null);u(this,"muxer",null);u(this,"filterer",null);u(this,"packet");u(this,"endTime");c(this,S,void 0);c(this,E,0);u(this,"demuxerStream");u(this,"readStream");u(this,"lastFrame",null);u(this,"filteredFrames",[]);c(this,v,!1);c(this,M,!1)}static async create(e){const t=new J;return await t.init(e),t}async init({inputFileOrUrl:e,outputFile:t,threadCount:r=8,endTime:a,interpolateFps:o,interpolateMode:n}){if(!e)throw new Error("Can only use file OR url");let w,f="rgba";console.log("init",{inputFileOrUrl:e,outputFile:t,threadCount:r,endTime:a,interpolateFps:o,interpolateMode:n,outputPixelFormat:f});let Q;if(e.startsWith("http")){console.log("downloading url");const p=new de(e);await p.download(),e=p.filepath,console.log("finished downloading")}console.log("file mode");const l=await b.demuxer("file:"+e);console.log({time_base:l.streams[0].time_base});const P=b.decoder({demuxer:l,width:l.streams[0].codecpar.width,height:l.streams[0].codecpar.height,stream_index:0,pix_fmt:l.streams[0].codecpar.format,thread_count:r});let g=null;if(t&&(["png","tiff","mjpeg"].forEach(p=>{t.endsWith(p)&&(g=p,g==="mjpeg"&&(f="yuvj422p"),g==="png"&&(f="rgb24"))}),!g))throw new Error("Output format could not be determined");const C=await ue({stream:l.streams[0],outputPixelFormat:f,interpolateFps:o,interpolateMode:n});if(g){const p=fe({decoder:P,outputFormat:g,thread_count:r});this.encoder=p;const te=await we({thread_count:r,filename:t,sourceDemuxer:l});this.muxer=te}this.decoder=P,this.demuxer=l,this.filterer=C,this.endTime=a,this.demuxerStream=Q,this.readStream=w}get duration(){const e=this.demuxer.streams[0].time_base,t=this.demuxer.streams.map(r=>r.duration*e[0]/e[1]);return Math.max(...t)}get width(){return this.demuxer.streams[0].codecpar.width}get height(){return this.demuxer.streams[0].codecpar.height}async seekToPTS(e){if(!(e===0&&!this.packet))for(this.lastFrame=null,d(this,E,e),console.log(`Seeking to PTS=${e}`),await h(this,N,H).call(this),await this.demuxer.seek({stream_index:0,timestamp:e}),await h(this,N,H).call(this);this.packet&&this.packet.pts>e;)this.packet.flags={DISCARD:!0},await h(this,T,_).call(this)}async getFrameAtTime(e){const t=Math.floor(this.timeToPts(e));return this.getFrameAtPts(t)}async getFrameImageDataAtTime(e){const t=Math.floor(this.timeToPts(e)),r=await this.getFrameAtPts(t),a=4,o=r.width*r.height*a,n=new Uint8ClampedArray(o),w=r.linesize,f=r.data[0];for(let l=0;l<r.height;l++){const P=l*w,g=P+r.width*a,C=f.slice(P,g),p=l*r.width*a;n.set(C,p)}return ie.createImageData(n,r.width,r.height)}async getFrameAtPts(e){if(this.packet){const a=this.ptsToTime(e),o=this.ptsToTime(this.lastFrame.pts),n=2;Math.abs(a-o)>n&&await this.seekToPTS(e)}if(this.packet===null&&this.filteredFrames.length===0&&e>=this.lastFrame.pts)return this.lastFrame;if(this.filteredFrames.length>0&&e<this.filteredFrames[0].pts)return this.lastFrame;let t=null;const r=await new Promise(async a=>{const o=async n=>n.pts===e?(this.lastFrame=n,a(n),!1):n.pts>e?this.lastFrame?(a(this.lastFrame),this.filteredFrames=[n,...this.filteredFrames],!1):(this.filteredFrames=[n,...this.filteredFrames],this.lastFrame=n,a(n),!1):this.packet===null&&this.filteredFrames.length===0&&e>=this.lastFrame.pts?(a(n),!1):(this.lastFrame=n,!0);t=this.readFrames({onFrameAvailable:o,flush:!0}),await t});return await t,r}async seekToTime(e){await this.seekToPTS(this.timeToPts(e))}timeToPts(e){const t=this.demuxer.streams[0].time_base;return e*t[1]/t[0]}ptsToTime(e){const t=this.demuxer.streams[0].time_base;return e*t[0]/t[1]}async withLock(e){if(m(this,S))throw new Error("Multiple attempts to use beamcoder at the same time.");d(this,S,!0),await e(),d(this,S,!1)}async readFrames({onFrameAvailable:e,flush:t=!0}={flush:!0,onFrameAvailable:()=>!0}){await this.withLock(async()=>{const r=e;if(m(this,$,G)&&(e=async o=>{const n=await this.encoder.encode(o);return await h(this,q,V).call(this,n),await r(o)}),!!h(this,D,K).call(this,[],{onFrameAvailable:e})&&this.packet!==null){{const{needsMore:o}=await h(this,L,X).call(this,{onFrameAvailable:e});if(!o)return}t&&await h(this,W,ee).call(this,{onFrameAvailable:e})}})}async dispose(){await new Promise(e=>{setTimeout(()=>{this.readStream&&(this.readStream.unpipe(this.demuxerStream),this.readStream.destroy())},30)})}};let z=J;S=new WeakMap,E=new WeakMap,v=new WeakMap,M=new WeakMap,A=new WeakSet,B=async function(){if(m(this,v))throw new Error("Error: Trying to read after stream has stopped.");try{const e=await this.demuxer.read();return e||d(this,v,!0),e}catch(e){throw e}},T=new WeakSet,_=async function(){if(this.packet===null)throw new Error("Stream is over!");for(this.packet=await h(this,A,B).call(this);this.packet&&this.packet.stream_index!==0;)if(this.packet=await h(this,A,B).call(this),this.packet===null)return},N=new WeakSet,H=async function(){for(;!this.packet||this.packet.stream_index!==0;)await h(this,T,_).call(this)},j=new WeakSet,U=async function(e){const t=await this.filterer.filter([{name:"in0:v",frames:e}]);return this.filteredFrames=t.flatMap(r=>r.frames),this.filteredFrames},D=new WeakSet,K=async function(e,{onFrameAvailable:t=()=>!0}){let r=!0;for(;this.filteredFrames.length>0&&r;){const a=this.filteredFrames.shift();r=await t(a)}return{needsMore:r}},q=new WeakSet,V=async function(e){for(let t=0;t<e.packets.length;t++)(!m(this,E)||e.packets[t].pts>=m(this,E))&&await this.muxer.writeFrame(e.packets[t])},R=new WeakSet,Y=async function({decoderResult:e,onFrameAvailable:t}){const r=await h(this,j,U).call(this,e.frames),{needsMore:a}=await h(this,D,K).call(this,r,{onFrameAvailable:t});return{needsMore:a}},L=new WeakSet,X=async function({onFrameAvailable:e}){for(await h(this,T,_).call(this);this.packet;){const t=await this.decoder.decode(this.packet),{needsMore:r}=await h(this,R,Y).call(this,{decoderResult:t,onFrameAvailable:e});if(!r)return{needsMore:r};await h(this,T,_).call(this)}return{needsMore:!0}},$=new WeakSet,G=function(){return this.encoder!==null},I=new WeakSet,Z=async function(){if(!m(this,$,G))return;const e=await this.encoder.flush();await h(this,q,V).call(this,e)},W=new WeakSet,ee=async function({onFrameAvailable:e}){if(m(this,M))throw new Error("Already flushed");d(this,M,!0);const t=await this.decoder.flush(),{needsMore:r}=await h(this,R,Y).call(this,{decoderResult:t,onFrameAvailable:e});r&&await h(this,I,Z).call(this)};const fe=({decoder:i,outputFormat:s,thread_count:e})=>{let t="rgb24";return s==="mjpeg"&&(t="yuvj422p"),b.encoder({name:s,width:i.width,height:i.height,pix_fmt:t,thread_count:e,time_base:[1,1]})},we=async({filename:i,sourceDemuxer:s,thread_count:e})=>{const t=b.demuxers(),r=t[Object.keys(t).find(o=>o.indexOf("mp4")>-1)],a=b.muxer({name:"image2",filename:i,thread_count:e,iformat:r});return a.newStream(s.streams[0]),await a.writeHeader(),a};exports.BeamcoderExtractor=z;
1
+ "use strict";var re=Object.defineProperty;var se=(i,s,e)=>s in i?re(i,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[s]=e;var u=(i,s,e)=>(se(i,typeof s!="symbol"?s+"":s,e),e),O=(i,s,e)=>{if(!s.has(i))throw TypeError("Cannot "+e)};var m=(i,s,e)=>(O(i,s,"read from private field"),e?e.call(i):s.get(i)),c=(i,s,e)=>{if(s.has(i))throw TypeError("Cannot add the same private member more than once");s instanceof WeakSet?s.add(i):s.set(i,e)},d=(i,s,e,t)=>(O(i,s,"write to private field"),t?t.call(i,e):s.set(i,e),e);var h=(i,s,e)=>(O(i,s,"access private method"),e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("beamcoder"),ie=require("canvas"),ae=require("path"),ne=require("node:https"),oe=require("http"),ce=require("tmp"),he=require("fs-extra");class me{static async create(s){throw new Error("Not implemented")}async init({inputFileOrUrl:s,outputFile:e,threadCount:t=8,endTime:r,interpolateFps:a,interpolateMode:o}){throw new Error("Not implemented")}get duration(){throw new Error("Not implemented")}get width(){throw new Error("Not implemented")}get height(){throw new Error("Not implemented")}async seekToPTS(s){throw new Error("Not implemented")}async getFrameAtTime(s){throw new Error("Not implemented")}async getImageDataAtTime(s){throw new Error("Not implemented")}async getFrameAtPts(s){throw new Error("Not implemented")}async seekToTime(s){throw new Error("Not implemented")}ptsToTime(s){throw new Error("Not implemented")}async readFrames({onFrameAvailable:s,flush:e=!0}={flush:!0,onFrameAvailable:()=>!0}){throw new Error("Not implemented")}async dispose(){throw new Error("Not implemented")}}class le extends Error{}var x,T,k,y;class de{constructor(s){c(this,x,void 0);c(this,T,void 0);c(this,k,void 0);c(this,y,void 0);d(this,x,s)}get filepath(){return m(this,k)}async download(){await new Promise((s,e)=>{const t=m(this,x),r=ae.extname(t);d(this,y,ce.fileSync({postfix:r}));try{const a=t.startsWith("https://")?ne:oe;d(this,T,a.get(t,o=>{const n=o.headers["content-type"];if(!n.includes("video")){const f=new Error(`Source ${t}, returned unsupported content type ${n}`);e(f);return}const w=he.createWriteStream(m(this,y).name);o.pipe(w),w.on("finish",()=>{w.close(),d(this,k,m(this,y).name),s()}),w.on("error",f=>{e(f)})})),m(this,T).on("error",o=>{o instanceof le||e(o)})}catch(a){e(a)}})}clear(){m(this,y)&&m(this,y).removeCallback(),m(this,x)&&d(this,x,void 0),m(this,T)&&d(this,T,null),m(this,k)&&d(this,k,void 0)}}x=new WeakMap,T=new WeakMap,k=new WeakMap,y=new WeakMap;const ue=async({stream:i,outputPixelFormat:s,interpolateFps:e,interpolateMode:t="fast"})=>{if(!i.codecpar.format)return null;let r=[`[in0:v]format=${i.codecpar.format}`];if(e)if(t==="high-quality")r=[...r,`minterpolate=fps=${e}`];else if(t==="fast")r=[...r,`fps=${e}`];else throw new Error(`Unexpected interpolation mode: ${t}`);r=[...r];const a=r.join(", ")+"[out0:v]";return console.log(`filterSpec: ${a}`),b.filterer({filterType:"video",inputParams:[{name:"in0:v",width:i.codecpar.width,height:i.codecpar.height,pixelFormat:i.codecpar.format,timeBase:i.time_base,pixelAspect:i.sample_aspect_ratio}],outputParams:[{name:"out0:v",pixelFormat:s}],filterSpec:a})};var S,E,v,A,M,B,F,_,N,H,j,U,D,K,q,V,R,Y,I,X,$,G,L,Z,W,ee;const J=class extends me{constructor(){super(...arguments);c(this,M);c(this,F);c(this,N);c(this,j);c(this,D);c(this,q);c(this,R);c(this,I);c(this,$);c(this,L);c(this,W);u(this,"decoder",null);u(this,"demuxer",null);u(this,"encoder",null);u(this,"muxer",null);u(this,"filterer",null);u(this,"packet");u(this,"endTime");c(this,S,void 0);c(this,E,0);u(this,"demuxerStream");u(this,"readStream");u(this,"lastFrame",null);u(this,"filteredFrames",[]);c(this,v,!1);c(this,A,!1)}static async create(e){const t=new J;return await t.init(e),t}async init({inputFileOrUrl:e,outputFile:t,threadCount:r=8,endTime:a,interpolateFps:o,interpolateMode:n}){if(!e)throw new Error("Can only use file OR url");let w,f="rgba";console.log("init",{inputFileOrUrl:e,outputFile:t,threadCount:r,endTime:a,interpolateFps:o,interpolateMode:n,outputPixelFormat:f});let Q;if(e.startsWith("http")){console.log("downloading url");const p=new de(e);await p.download(),e=p.filepath,console.log("finished downloading")}console.log("file mode");const l=await b.demuxer("file:"+e);console.log({time_base:l.streams[0].time_base});const P=b.decoder({demuxer:l,width:l.streams[0].codecpar.width,height:l.streams[0].codecpar.height,stream_index:0,pix_fmt:l.streams[0].codecpar.format,thread_count:r});let g=null;if(t&&(["png","tiff","mjpeg"].forEach(p=>{t.endsWith(p)&&(g=p,g==="mjpeg"&&(f="yuvj422p"),g==="png"&&(f="rgb24"))}),!g))throw new Error("Output format could not be determined");const C=await ue({stream:l.streams[0],outputPixelFormat:f,interpolateFps:o,interpolateMode:n});if(g){const p=fe({decoder:P,outputFormat:g,thread_count:r});this.encoder=p;const te=await we({thread_count:r,filename:t,sourceDemuxer:l});this.muxer=te}this.decoder=P,this.demuxer=l,this.filterer=C,this.endTime=a,this.demuxerStream=Q,this.readStream=w}get duration(){const e=this.demuxer.streams[0].time_base,t=this.demuxer.streams.map(r=>r.duration*e[0]/e[1]);return Math.max(...t)}get width(){return this.demuxer.streams[0].codecpar.width}get height(){return this.demuxer.streams[0].codecpar.height}async seekToPTS(e){if(!(e===0&&!this.packet))for(this.lastFrame=null,d(this,E,e),console.log(`Seeking to PTS=${e}`),await h(this,N,H).call(this),await this.demuxer.seek({stream_index:0,timestamp:e}),await h(this,N,H).call(this);this.packet&&this.packet.pts>e;)this.packet.flags={DISCARD:!0},await h(this,F,_).call(this)}async getFrameAtTime(e){const t=Math.floor(this.timeToPts(e));return this.getFrameAtPts(t)}async getImageDataAtTime(e){const t=Math.floor(this.timeToPts(e)),r=await this.getFrameAtPts(t),a=4,o=r.width*r.height*a,n=new Uint8ClampedArray(o),w=r.linesize,f=r.data[0];for(let l=0;l<r.height;l++){const P=l*w,g=P+r.width*a,C=f.slice(P,g),p=l*r.width*a;n.set(C,p)}return ie.createImageData(n,r.width,r.height)}async getFrameAtPts(e){if(this.packet){const a=this.ptsToTime(e),o=this.ptsToTime(this.lastFrame.pts),n=2;Math.abs(a-o)>n&&await this.seekToPTS(e)}if(this.packet===null&&this.filteredFrames.length===0&&e>=this.lastFrame.pts)return this.lastFrame;if(this.filteredFrames.length>0&&e<this.filteredFrames[0].pts)return this.lastFrame;let t=null;const r=await new Promise(async a=>{const o=async n=>n.pts===e?(this.lastFrame=n,a(n),!1):n.pts>e?this.lastFrame?(a(this.lastFrame),this.filteredFrames=[n,...this.filteredFrames],!1):(this.filteredFrames=[n,...this.filteredFrames],this.lastFrame=n,a(n),!1):this.packet===null&&this.filteredFrames.length===0&&e>=this.lastFrame.pts?(a(n),!1):(this.lastFrame=n,!0);t=this.readFrames({onFrameAvailable:o,flush:!0}),await t});return await t,r}async seekToTime(e){await this.seekToPTS(this.timeToPts(e))}timeToPts(e){const t=this.demuxer.streams[0].time_base;return e*t[1]/t[0]}ptsToTime(e){const t=this.demuxer.streams[0].time_base;return e*t[0]/t[1]}async withLock(e){if(m(this,S))throw new Error("Multiple attempts to use beamcoder at the same time.");d(this,S,!0),await e(),d(this,S,!1)}async readFrames({onFrameAvailable:e,flush:t=!0}={flush:!0,onFrameAvailable:()=>!0}){await this.withLock(async()=>{const r=e;if(m(this,$,G)&&(e=async o=>{const n=await this.encoder.encode(o);return await h(this,q,V).call(this,n),await r(o)}),!!h(this,D,K).call(this,[],{onFrameAvailable:e})&&this.packet!==null){{const{needsMore:o}=await h(this,I,X).call(this,{onFrameAvailable:e});if(!o)return}t&&await h(this,W,ee).call(this,{onFrameAvailable:e})}})}async dispose(){await new Promise(e=>{setTimeout(()=>{this.readStream&&(this.readStream.unpipe(this.demuxerStream),this.readStream.destroy())},30)})}};let z=J;S=new WeakMap,E=new WeakMap,v=new WeakMap,A=new WeakMap,M=new WeakSet,B=async function(){if(m(this,v))throw new Error("Error: Trying to read after stream has stopped.");try{const e=await this.demuxer.read();return e||d(this,v,!0),e}catch(e){throw e}},F=new WeakSet,_=async function(){if(this.packet===null)throw new Error("Stream is over!");for(this.packet=await h(this,M,B).call(this);this.packet&&this.packet.stream_index!==0;)if(this.packet=await h(this,M,B).call(this),this.packet===null)return},N=new WeakSet,H=async function(){for(;!this.packet||this.packet.stream_index!==0;)await h(this,F,_).call(this)},j=new WeakSet,U=async function(e){const t=await this.filterer.filter([{name:"in0:v",frames:e}]);return this.filteredFrames=t.flatMap(r=>r.frames),this.filteredFrames},D=new WeakSet,K=async function(e,{onFrameAvailable:t=()=>!0}){let r=!0;for(;this.filteredFrames.length>0&&r;){const a=this.filteredFrames.shift();r=await t(a)}return{needsMore:r}},q=new WeakSet,V=async function(e){for(let t=0;t<e.packets.length;t++)(!m(this,E)||e.packets[t].pts>=m(this,E))&&await this.muxer.writeFrame(e.packets[t])},R=new WeakSet,Y=async function({decoderResult:e,onFrameAvailable:t}){const r=await h(this,j,U).call(this,e.frames),{needsMore:a}=await h(this,D,K).call(this,r,{onFrameAvailable:t});return{needsMore:a}},I=new WeakSet,X=async function({onFrameAvailable:e}){for(await h(this,F,_).call(this);this.packet;){const t=await this.decoder.decode(this.packet),{needsMore:r}=await h(this,R,Y).call(this,{decoderResult:t,onFrameAvailable:e});if(!r)return{needsMore:r};await h(this,F,_).call(this)}return{needsMore:!0}},$=new WeakSet,G=function(){return this.encoder!==null},L=new WeakSet,Z=async function(){if(!m(this,$,G))return;const e=await this.encoder.flush();await h(this,q,V).call(this,e)},W=new WeakSet,ee=async function({onFrameAvailable:e}){if(m(this,A))throw new Error("Already flushed");d(this,A,!0);const t=await this.decoder.flush(),{needsMore:r}=await h(this,R,Y).call(this,{decoderResult:t,onFrameAvailable:e});r&&await h(this,L,Z).call(this)};const fe=({decoder:i,outputFormat:s,thread_count:e})=>{let t="rgb24";return s==="mjpeg"&&(t="yuvj422p"),b.encoder({name:s,width:i.width,height:i.height,pix_fmt:t,thread_count:e,time_base:[1,1]})},we=async({filename:i,sourceDemuxer:s,thread_count:e})=>{const t=b.demuxers(),r=t[Object.keys(t).find(o=>o.indexOf("mp4")>-1)],a=b.muxer({name:"image2",filename:i,thread_count:e,iformat:r});return a.newStream(s.streams[0]),await a.writeHeader(),a};exports.BeamcoderExtractor=z;
2
2
  //# sourceMappingURL=framefusion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"framefusion.cjs","sources":["../src/BaseExtractor.ts","../src/DownloadVideoURL.ts","../src/backends/beamcoder.ts"],"sourcesContent":["import type {\n ExtractorArgs,\n Frame,\n Extractor\n} from '../framefusion';\n\nexport class BaseExtractor implements Extractor {\n static async create(args: ExtractorArgs): Promise<Extractor> {\n throw new Error('Not implemented');\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n throw new Error('Not implemented');\n }\n\n get duration(): number {\n throw new Error('Not implemented');\n }\n\n get width(): number {\n throw new Error('Not implemented');\n }\n\n get height(): number {\n throw new Error('Not implemented');\n }\n\n async seekToPTS(targetPts: number) {\n throw new Error('Not implemented');\n }\n\n async getFrameAtTime(targetTime: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async getFrameAtPts(targetPts: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async seekToTime(targetTime: number) {\n throw new Error('Not implemented');\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n throw new Error('Not implemented');\n }\n\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n throw new Error('Not implemented');\n }\n\n async dispose() {\n throw new Error('Not implemented');\n }\n}\n","import path from 'path';\nimport https from 'node:https';\nimport type { ClientRequest } from 'http';\nimport http from 'http';\nimport tmp from 'tmp';\nimport fs from 'fs-extra';\n\nclass CancelRequestError extends Error { }\n\n/**\n * Downloads a video file from a given URL as a temporary file. When the object is cleared, the temporary file is\n * deleted.\n */\nexport class DownloadVideoURL {\n #url: string | undefined;\n #httpRequest: ClientRequest | undefined = undefined;\n #filepath: string | undefined = undefined;\n #tmpObj: tmp.SynchrounousResult | undefined = undefined;\n\n constructor(url) {\n this.#url = url;\n }\n\n /**\n * returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined\n */\n get filepath() {\n return this.#filepath;\n }\n\n /**\n * Downloads the file from the given URL. The file will be downloaded to a temporary file.\n */\n async download() {\n await new Promise<void>((resolve, reject) => {\n const source = this.#url;\n const extension = path.extname(source);\n this.#tmpObj = tmp.fileSync({ postfix: extension });\n try {\n const connectionHandler = source.startsWith('https://') ? https : http;\n this.#httpRequest = connectionHandler.get(source, (res) => {\n const contentType = res.headers['content-type'];\n if (!contentType.includes('video')) {\n const err = new Error(`Source ${source}, returned unsupported content type ${contentType}`);\n reject(err);\n return;\n }\n const writeStream = fs.createWriteStream(this.#tmpObj.name);\n res.pipe(writeStream);\n writeStream.on('finish', () => {\n writeStream.close();\n this.#filepath = this.#tmpObj.name;\n resolve();\n });\n writeStream.on('error', (e) => {\n reject(e);\n });\n });\n this.#httpRequest.on('error', (e) => {\n if (e instanceof CancelRequestError) {\n return;\n }\n reject(e);\n });\n }\n catch (e) {\n reject(e);\n }\n });\n }\n\n clear() {\n if (this.#tmpObj) this.#tmpObj.removeCallback();\n if (this.#url) this.#url = undefined;\n if (this.#httpRequest) this.#httpRequest = null;\n if (this.#filepath) this.#filepath = undefined;\n }\n}\n","import type { Stream } from 'stream';\nimport type { ReadStream } from 'fs';\nimport type {\n Frame\n} from 'beamcoder';\nimport beamcoder from 'beamcoder';\nimport { createImageData } from 'canvas';\nimport type { ImageData } from 'canvas';\nimport type {\n InterpolateMode,\n Extractor,\n ExtractorArgs\n} from '../../framefusion.js';\nimport {\n BaseExtractor\n} from '../BaseExtractor.js';\nimport { DownloadVideoURL } from '../DownloadVideoURL.js';\n\nconst LOG_PACKET_FLOW = false;\nconst LOG_SINGLE_FRAME_DUMP_FLOW = false;\n\n/**\n * Assumptions made by this library:\n *\n * - The input is always a mp4\n * It would be nice to support other formats. One thing to change is the iformat, hardcoded for mp4.\n *\n * - Stream 0 is the video stream we want to extract.\n * It would be good to detect cases where stream 0 is an audio stream an switch to the next stream.\n *\n */\nexport const probeCodecPar = codecpar => ({\n type: codecpar.type,\n codec_type: codecpar.codec_type,\n codec_id: codecpar.codec_id,\n name: codecpar.name,\n codec_tag: codecpar.codec_tag,\n extradata: codecpar.extradata,\n format: codecpar.format,\n bit_rate: codecpar.bit_rate,\n bits_per_coded_sample: codecpar.bits_per_coded_sample,\n bits_per_raw_sample: codecpar.bits_per_raw_sample,\n profile: codecpar.profile,\n level: codecpar.level,\n width: codecpar.width,\n height: codecpar.height,\n sample_aspect_ratio: codecpar.sample_aspect_ratio,\n field_order: codecpar.field_order,\n color_range: codecpar.color_range,\n color_primaries: codecpar.color_primaries,\n color_trc: codecpar.color_trc,\n color_space: codecpar.color_space,\n chroma_location: codecpar.chroma_location,\n video_delay: codecpar.video_delay,\n channel_layout: codecpar.channel_layout,\n channels: codecpar.channels,\n sample_rate: codecpar.sample_rate,\n block_align: codecpar.block_align,\n frame_size: codecpar.frame_size,\n initial_padding: codecpar.initial_padding,\n trailing_padding: codecpar.trailing_padding,\n seek_preroll: codecpar.seek_preroll,\n});\n\nexport const probeStream = stream => ({\n type: stream.type,\n index: stream.index,\n id: stream.id,\n time_base: stream.time_base,\n start_time: stream.start_time,\n duration: stream.duration,\n nb_frames: stream.nb_frames,\n disposition: stream.disposition,\n discard: stream.discard,\n sample_aspect_ratio: stream.sample_aspect_ratio,\n metadata: stream.metadata,\n avg_frame_rate: stream.avg_frame_rate,\n attached_pic: stream.attached_pic,\n side_data: stream.side_data,\n event_flags: stream.event_flags,\n r_frame_rate: stream.r_frame_rate,\n codecpar: probeCodecPar(stream.codecpar),\n});\n\n\n/**\n * A filter to convert between color spaces.\n * An example would be YUV to RGB, for mp4 to png conversion.\n */\nconst getFilter = async({\n stream,\n outputPixelFormat,\n interpolateFps,\n interpolateMode = 'fast',\n}: {\n stream: beamcoder.Stream;\n outputPixelFormat: string;\n interpolateFps?: number;\n interpolateMode?: InterpolateMode;\n}): Promise<beamcoder.Filterer> => {\n if (!stream.codecpar.format) {\n return null;\n }\n\n let filterSpec = [`[in0:v]format=${stream.codecpar.format}`];\n\n if (interpolateFps) {\n if (interpolateMode === 'high-quality') {\n filterSpec = [...filterSpec, `minterpolate=fps=${interpolateFps}`];\n }\n else if (interpolateMode === 'fast') {\n filterSpec = [...filterSpec, `fps=${interpolateFps}`];\n }\n else {\n throw new Error(`Unexpected interpolation mode: ${interpolateMode}`);\n }\n }\n\n filterSpec = [...filterSpec];\n\n const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n console.log(`filterSpec: ${filterSpecStr}`);\n\n return beamcoder.filterer({\n filterType: 'video',\n inputParams: [\n {\n name: 'in0:v',\n width: stream.codecpar.width,\n height: stream.codecpar.height,\n pixelFormat: stream.codecpar.format,\n timeBase: stream.time_base,\n pixelAspect: stream.sample_aspect_ratio,\n },\n ],\n outputParams: [\n {\n name: 'out0:v',\n pixelFormat: outputPixelFormat,\n },\n ],\n filterSpec: filterSpecStr,\n });\n};\n\n/**\n * Class to keep track of the muxer/demuxer/encoder/muxer used while extracting a video to frames.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n decoder: beamcoder.Decoder = null;\n demuxer: beamcoder.Demuxer = null;\n encoder: beamcoder.Encoder = null;\n muxer: beamcoder.Muxer = null;\n filterer: beamcoder.Filterer = null;\n packet: beamcoder.Packet;\n endTime: number;\n #locked: boolean;\n #targetPts = 0;\n demuxerStream: beamcoder.WritableDemuxerStream;\n readStream: ReadStream;\n lastFrame: beamcoder.Frame = null;\n filteredFrames: beamcoder.Frame[] = [];\n #streamStopped = false;\n #flushed = false;\n\n /**\n * Encoder/Decoder constuction is async, so it can't be put in a regular constructor.\n *\n * Use and await this method to generate an extactor.\n */\n static async create(args: ExtractorArgs): Promise<Extractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor as unknown as Extractor;\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n if (!inputFileOrUrl) {\n throw new Error('Can only use file OR url');\n }\n let readStream: Stream;\n let outputPixelFormat = 'rgba';\n\n console.log('init', { inputFileOrUrl, outputFile, threadCount, endTime, interpolateFps, interpolateMode, outputPixelFormat });\n\n //\n // - Demuxing -\n //\n // The demuxer reads the file and outputs packet streams\n //\n\n let demuxerStream;\n\n if (inputFileOrUrl.startsWith('http')) {\n console.log('downloading url');\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n console.log('finished downloading');\n }\n\n console.log('file mode');\n const demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n\n\n console.log({ time_base: demuxer.streams[0].time_base });\n\n //\n // - Decoding -\n //\n // The decoder reads packets and can output raw frame data\n //\n\n const decoder = beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[0].codecpar.width,\n height: demuxer.streams[0].codecpar.height,\n stream_index: 0,\n pix_fmt: demuxer.streams[0].codecpar.format,\n thread_count: threadCount,\n });\n\n let outputFormat: OutputFormats | null = null;\n\n if (outputFile) {\n ['png', 'tiff', 'mjpeg'].forEach(format => {\n if (outputFile.endsWith(format)) {\n outputFormat = format as OutputFormats;\n\n // TODO: build a map of outputFormats to outputPixelFormats and remove this from this loop.\n if (outputFormat === 'mjpeg') {\n outputPixelFormat = 'yuvj422p';\n }\n\n if (outputFormat === 'png') {\n outputPixelFormat = 'rgb24';\n }\n }\n });\n\n if (!outputFormat) {\n throw new Error('Output format could not be determined');\n }\n }\n\n //\n // - Filtering -\n //\n // Packets can be filtered to change colorspace, fps and add various effects\n // If there are no color space changes or filters, filter might not be necessary.\n //\n\n const filterer = await getFilter({\n stream: demuxer.streams[0],\n outputPixelFormat,\n interpolateFps,\n interpolateMode,\n });\n\n if (outputFormat) {\n //\n // - Encoding -\n //\n // Encode frames in packets of the output format\n //\n // This process is usually slower than decoding!\n const encoder = createFrameDumpingEncoder({\n decoder,\n outputFormat,\n thread_count: threadCount,\n });\n this.encoder = encoder;\n\n //\n // - Muxing -\n //\n // Assemble packets in a format that can be sent to the outside world!\n //\n\n // This process is usually slower than decoding!\n const muxer = await createFrameDumpingMuxer({\n thread_count: threadCount,\n filename: outputFile,\n sourceDemuxer: demuxer,\n });\n\n this.muxer = muxer;\n }\n\n this.decoder = decoder;\n this.demuxer = demuxer;\n this.filterer = filterer;\n this.endTime = endTime;\n this.demuxerStream = demuxerStream;\n this.readStream = readStream as ReadStream;\n }\n\n get duration(): number {\n const time_base = this.demuxer.streams[0].time_base;\n const durations = this.demuxer.streams.map(\n stream => stream.duration * time_base[0] / time_base[1]\n );\n\n return Math.max(...durations);\n }\n\n get width(): number {\n return this.demuxer.streams[0].codecpar.width;\n }\n\n get height(): number {\n return this.demuxer.streams[0].codecpar.height;\n }\n\n /**\n * Seek to a given PTS in the stream\n *\n * PTS stands for presentation time stamp. It's expressed in time_base units.\n * If timebase is 1/10000,\n * and a frame PTS is 10000,\n * Then the frame must be displayed at exactly 1 second.\n */\n async seekToPTS(targetPts: number) {\n if (targetPts === 0 && !this.packet) {\n // No need to seek, we haven't started reading yet.\n return;\n }\n this.lastFrame = null;\n this.#targetPts = targetPts;\n console.log(`Seeking to PTS=${targetPts}`);\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n await this.demuxer.seek({ stream_index: 0, timestamp: targetPts });\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n\n // When seeking to the past:\n // Skip any packets which were read before.\n // at a PTS bigger than the target PTS.\n while (this.packet && this.packet.pts > targetPts) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.packet.flags as any) = { DISCARD: true };\n await this.#nextPacket();\n }\n }\n\n\n /**\n * Dump one frame at a specific time\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n *\n * @see getFrameAtPts()\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n return this.getFrameAtPts(targetPts);\n }\n\n /**\n * Dump one frame's image data (for canvas) at a specific time\n *\n * @see getFrameAtTime()\n */\n async getFrameImageDataAtTime(targetTime: number): Promise<ImageData> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n const frame = await this.getFrameAtPts(targetPts);\n\n const components = 4; // 4 components: r, g, b and a\n const size = frame.width * frame.height * components;\n const rawData = new Uint8ClampedArray(size);\n const sourceLineSize = frame.linesize as unknown as number;\n const pixels = frame.data[0] as Uint8Array;\n\n // libav creates larger buffers because it makes their internal code simpler.\n // we have to trim a part at the right of each pixel row.\n for (let i = 0; i < frame.height; i++) {\n const sourceStart = i * sourceLineSize;\n const sourceEnd = sourceStart + frame.width * components;\n const sourceData = pixels.slice(sourceStart, sourceEnd);\n const targetOffset = i * frame.width * components;\n rawData.set(sourceData, targetOffset);\n }\n\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n );\n\n return image;\n }\n\n /**\n * Dump one frame at a specific pts\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n */\n async getFrameAtPts(targetPts: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at PTS=${targetPts}`);\n\n if (this.packet) {\n const newTime = this.ptsToTime(targetPts);\n const currentTime = this.ptsToTime(this.lastFrame.pts);\n\n // Heuristic: if moving more than `SEEK_DELAY` away, seek instead\n // of processing packets until target. Note that this logic is not\n // good if playback rate is faster.\n const SEEK_DELAY = 2.0;\n if (Math.abs(newTime - currentTime) > SEEK_DELAY) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Time difference is bigger than SEEK_DELAY=${SEEK_DELAY}. Seeking.`);\n await this.seekToPTS(targetPts);\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n return this.lastFrame;\n }\n\n if (this.filteredFrames.length > 0 && targetPts < this.filteredFrames[0].pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Next frame is to be presented later (at PTS=${this.filteredFrames[0].pts}), resolving with last frame again, pts=${this.lastFrame.pts} [video fps is probably low]`);\n return this.lastFrame;\n }\n\n // TODO:\n // - Seek if we are:\n // - Seeking to the past;\n // - Seeking beyond the next keyframe. AND; - or some other heuristic,\n // such as seeking more than 1 seconds in the future.\n // - Clear last image when seeking.\n // - Clear extra frames when seeking\n\n // Read packets and dump a single frame.\n let finishReadingCleanlyPromise = null;\n\n const frame = await new Promise<beamcoder.Frame>(async resolve => {\n const onFrameAvailable = async(frame) => {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Frame available: pts=${frame.pts}`);\n\n // When we decoded the next frame after targetPts,\n // that's when we know the last frame was the one\n // that had to be shown at targetPts\n if (frame.pts === targetPts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts === targetPts | ', `${frame.pts} === ${targetPts} - resolving with this frame!`);\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n\n if (frame.pts > targetPts) {\n if (this.lastFrame) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - resolving with previous frame (PTS=${this.lastFrame.pts})!`);\n resolve(this.lastFrame);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n return false;\n }\n else {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - but no last frame available - resolving with frame!`);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n resolve(frame);\n return false;\n }\n\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts < targetPts | ', `${frame.pts} < ${targetPts} - continuing`);\n\n this.lastFrame = frame;\n\n return true;\n };\n\n finishReadingCleanlyPromise = this.readFrames({\n onFrameAvailable,\n flush: true,\n });\n\n await finishReadingCleanlyPromise;\n });\n\n await finishReadingCleanlyPromise;\n\n return frame;\n }\n\n\n /**\n * Seek to a given time in the stream\n */\n async seekToTime(targetTime: number) {\n await this.seekToPTS(this.timeToPts(targetTime));\n }\n\n /**\n * Convert a time (in seconds) to PTS (based on timebase)\n */\n timeToPts(time: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n /**\n * This just calls `this.demuxer.read()` with additional logging in case of errors.\n */\n async #readPacketWrapped() {\n if (this.#streamStopped) {\n throw new Error('Error: Trying to read after stream has stopped.');\n }\n try {\n const packet = await this.demuxer.read();\n if (!packet) {\n this.#streamStopped = true;\n }\n return packet;\n }\n catch (e) {\n throw e;\n }\n }\n\n async #nextPacket() {\n if (this.packet === null) {\n throw new Error('Stream is over!');\n }\n this.packet = await this.#readPacketWrapped();\n while (this.packet && this.packet.stream_index !== 0) {\n this.packet = await this.#readPacketWrapped();\n if (this.packet === null) {\n return;\n }\n }\n }\n\n async #skipToStream0PacketIfNotAlreadyStream0() {\n while (!this.packet || this.packet.stream_index !== 0) {\n await this.#nextPacket();\n }\n }\n\n async #filterFrames(frames) {\n const result = await this.filterer.filter([{\n name: 'in0:v',\n frames: frames,\n }]);\n this.filteredFrames = result.flatMap(r => r.frames);\n return this.filteredFrames;\n }\n\n /**\n * Note: the promise returned is for the first frame only.\n */\n async #processFilteredFrames(frames: Frame[] | null, {\n onFrameAvailable = () => true,\n }: {\n onFrameAvailable?: (frame: beamcoder.Frame) => boolean | Promise<boolean>;\n }) {\n let needsMore = true;\n\n while (this.filteredFrames.length > 0 && needsMore) {\n const frame = this.filteredFrames.shift();\n LOG_PACKET_FLOW && console.log(`Sending filter result to encoder PTS=${frame.pts}`);\n needsMore = await onFrameAvailable(frame);\n }\n\n return { needsMore };\n }\n\n async #muxImageResults(imageResult): Promise<void> {\n for (let j = 0; j < imageResult.packets.length; j++) {\n const shouldSave = !this.#targetPts || imageResult.packets[j].pts >= this.#targetPts;\n\n if (shouldSave) {\n await this.muxer.writeFrame(imageResult.packets[j]);\n LOG_PACKET_FLOW && console.log(`wrote image ${JSON.stringify(imageResult.packets[j])}`);\n }\n else {\n LOG_PACKET_FLOW && console.log(`skipped image ${JSON.stringify(imageResult.packets[j])}`);\n }\n }\n }\n\n async #filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n }: {\n decoderResult?: beamcoder.DecodedFrames;\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n const filteredFrames = await this.#filterFrames(decoderResult.frames);\n const { needsMore } = await this.#processFilteredFrames(filteredFrames, {\n onFrameAvailable,\n });\n\n return { needsMore };\n }\n\n async #readPacketLoop({\n onFrameAvailable,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }): Promise<{ needsMore: boolean; }> {\n await this.#nextPacket();\n while (this.packet) {\n const decoderResult = await this.decoder.decode(this.packet);\n LOG_PACKET_FLOW && console.log(`Received ${decoderResult.frames.length} decoder frames`);\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return { needsMore };\n }\n\n await this.#nextPacket();\n }\n\n return { needsMore: true };\n }\n\n /**\n * #hasEncoder\n *\n * Sometimes, we don't need to encode so we'll have no encoder.\n * (when reading raw frames, and no outputFile is given)\n * Otherwise, here we'll want to pass frames to the encoder as well\n * as running onFrameAvailable.\n */\n get #hasEncoder() {\n return this.encoder !== null;\n }\n\n async #flushEncoder() {\n if (!this.#hasEncoder) {\n return;\n }\n LOG_PACKET_FLOW && console.log(`\\n Flushing encoder`);\n const imageResult = await this.encoder.flush();\n await this.#muxImageResults(imageResult);\n }\n\n async #flushFilterAndProcessFrames({\n onFrameAvailable,\n }: {\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n LOG_PACKET_FLOW && console.log(`\\n Flushing decoder`);\n\n if (this.#flushed) {\n throw new Error('Already flushed');\n }\n\n this.#flushed = true;\n const decoderResult = await this.decoder.flush();\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return;\n }\n\n await this.#flushEncoder();\n }\n\n /**\n * Detect multiple access to beamcoder which could put our system in an unexpected state.\n */\n async withLock(callback) {\n if (this.#locked) {\n throw new Error('Multiple attempts to use beamcoder at the same time.');\n }\n this.#locked = true;\n await callback();\n this.#locked = false;\n }\n\n /**\n * Dump all frames from the current point.\n * Stops processing packets after target is reached.\n */\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n await this.withLock(async() => {\n const originalOnFrameAvailable = onFrameAvailable;\n\n if (this.#hasEncoder) {\n onFrameAvailable = async(frame): Promise<boolean> => {\n LOG_PACKET_FLOW && console.log(`About to encode ${frame.pts}.\\n`);\n const imageResult = await this.encoder.encode(frame);\n await this.#muxImageResults(imageResult);\n\n LOG_PACKET_FLOW && console.log(`About to run originalOnFrameAvailable.\\n`);\n const needsMore = await originalOnFrameAvailable(frame);\n\n return needsMore;\n };\n }\n\n // First output successively frames which were already decoded and filtered\n const needsMore = this.#processFilteredFrames([], { onFrameAvailable });\n if (!needsMore) {\n LOG_PACKET_FLOW && console.log('No need to read more after reading buffered frames.');\n return;\n }\n\n // Maybe after processing extra frames. there are no frames left, because\n // we already read the last packet the previous time around.\n if (this.packet === null) {\n return;\n }\n\n // Main reading loop\n // Most frame reading happens here.\n // We read packets, filter them and call onFrameAvailable to let the calling code\n // perform it's work.\n {\n const { needsMore } = await this.#readPacketLoop({ onFrameAvailable });\n if (!needsMore) {\n return;\n }\n }\n\n // Flushing.\n // After every packet has been read by the main loop, we need to get the\n // last packets from the decoder (flush) and repeat filtering and calling onFrameAvailable like the main loop.\n if (flush) {\n await this.#flushFilterAndProcessFrames({ onFrameAvailable });\n }\n\n LOG_PACKET_FLOW && console.log(`\\nRead frame ended.\\n`);\n });\n }\n\n async dispose() {\n await new Promise((resolve) => {\n setTimeout(() => {\n if (this.readStream) {\n // These might be creating memory issues.\n this.readStream.unpipe(this.demuxerStream);\n this.readStream.destroy();\n }\n }, 30);\n });\n }\n}\n\ntype OutputFormats = 'mjpeg' | 'png' | 'tiff';\n\nconst createFrameDumpingEncoder = ({\n decoder,\n outputFormat,\n thread_count,\n}: {\n decoder: beamcoder.Decoder;\n outputFormat: OutputFormats;\n thread_count: number;\n}) => {\n let colorspace = 'rgb24';\n if (outputFormat === 'mjpeg') {\n colorspace = 'yuvj422p';\n }\n\n return beamcoder.encoder({\n name: outputFormat,\n width: decoder.width,\n height: decoder.height,\n pix_fmt: colorspace,\n thread_count: thread_count,\n time_base: [1, 1],\n });\n};\n\nconst createFrameDumpingMuxer = async({\n filename,\n sourceDemuxer,\n thread_count,\n}: {\n filename: string;\n sourceDemuxer: beamcoder.Demuxer;\n thread_count: number;\n}) => {\n const demuxers = beamcoder.demuxers();\n // The iformat is necessary to have a working probe when using a stream\n const iformat = demuxers[Object.keys(demuxers).find(key => key.indexOf('mp4') > -1)];\n\n const muxer = beamcoder.muxer({\n name: 'image2',\n filename,\n thread_count: thread_count,\n iformat,\n });\n\n muxer.newStream(sourceDemuxer.streams[0]);\n await muxer.writeHeader();\n return muxer;\n};\n"],"names":["BaseExtractor","args","inputFileOrUrl","outputFile","threadCount","endTime","interpolateFps","interpolateMode","targetPts","targetTime","pts","onFrameAvailable","flush","CancelRequestError","DownloadVideoURL","url","__privateAdd","_url","_httpRequest","_filepath","_tmpObj","__privateSet","__privateGet","resolve","reject","source","extension","path","tmp","connectionHandler","https","http","res","contentType","err","writeStream","fs","e","getFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","beamcoder","_BeamcoderExtractor","_readPacketWrapped","_nextPacket","_skipToStream0PacketIfNotAlreadyStream0","_filterFrames","_processFilteredFrames","_muxImageResults","_filterAndProcessFrames","_readPacketLoop","_hasEncoder","_flushEncoder","_flushFilterAndProcessFrames","__publicField","_locked","_targetPts","_streamStopped","_flushed","extractor","readStream","demuxerStream","downloadUrl","demuxer","decoder","outputFormat","format","filterer","encoder","createFrameDumpingEncoder","muxer","createFrameDumpingMuxer","time_base","durations","__privateMethod","skipToStream0PacketIfNotAlreadyStream0_fn","nextPacket_fn","frame","components","size","rawData","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","createImageData","newTime","currentTime","SEEK_DELAY","finishReadingCleanlyPromise","time","callback","originalOnFrameAvailable","hasEncoder_get","imageResult","muxImageResults_fn","processFilteredFrames_fn","needsMore","readPacketLoop_fn","flushFilterAndProcessFrames_fn","BeamcoderExtractor","readPacketWrapped_fn","packet","filterFrames_fn","frames","result","j","filterAndProcessFrames_fn","decoderResult","filteredFrames","flushEncoder_fn","thread_count","colorspace","filename","sourceDemuxer","demuxers","iformat","key"],"mappings":"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"}
1
+ {"version":3,"file":"framefusion.cjs","sources":["../src/BaseExtractor.ts","../src/DownloadVideoURL.ts","../src/backends/beamcoder.ts"],"sourcesContent":["import type { ImageData } from 'canvas';\n\nimport type {\n ExtractorArgs,\n Frame,\n Extractor\n} from '../framefusion';\n\nexport class BaseExtractor implements Extractor {\n static async create(args: ExtractorArgs): Promise<Extractor> {\n throw new Error('Not implemented');\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n throw new Error('Not implemented');\n }\n\n get duration(): number {\n throw new Error('Not implemented');\n }\n\n get width(): number {\n throw new Error('Not implemented');\n }\n\n get height(): number {\n throw new Error('Not implemented');\n }\n\n async seekToPTS(targetPts: number) {\n throw new Error('Not implemented');\n }\n\n async getFrameAtTime(targetTime: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n throw new Error('Not implemented');\n }\n\n async getFrameAtPts(targetPts: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async seekToTime(targetTime: number) {\n throw new Error('Not implemented');\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n throw new Error('Not implemented');\n }\n\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n throw new Error('Not implemented');\n }\n\n async dispose() {\n throw new Error('Not implemented');\n }\n}\n","import path from 'path';\nimport https from 'node:https';\nimport type { ClientRequest } from 'http';\nimport http from 'http';\nimport tmp from 'tmp';\nimport fs from 'fs-extra';\n\nclass CancelRequestError extends Error { }\n\n/**\n * Downloads a video file from a given URL as a temporary file. When the object is cleared, the temporary file is\n * deleted.\n */\nexport class DownloadVideoURL {\n #url: string | undefined;\n #httpRequest: ClientRequest | undefined = undefined;\n #filepath: string | undefined = undefined;\n #tmpObj: tmp.SynchrounousResult | undefined = undefined;\n\n constructor(url) {\n this.#url = url;\n }\n\n /**\n * returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined\n */\n get filepath() {\n return this.#filepath;\n }\n\n /**\n * Downloads the file from the given URL. The file will be downloaded to a temporary file.\n */\n async download() {\n await new Promise<void>((resolve, reject) => {\n const source = this.#url;\n const extension = path.extname(source);\n this.#tmpObj = tmp.fileSync({ postfix: extension });\n try {\n const connectionHandler = source.startsWith('https://') ? https : http;\n this.#httpRequest = connectionHandler.get(source, (res) => {\n const contentType = res.headers['content-type'];\n if (!contentType.includes('video')) {\n const err = new Error(`Source ${source}, returned unsupported content type ${contentType}`);\n reject(err);\n return;\n }\n const writeStream = fs.createWriteStream(this.#tmpObj.name);\n res.pipe(writeStream);\n writeStream.on('finish', () => {\n writeStream.close();\n this.#filepath = this.#tmpObj.name;\n resolve();\n });\n writeStream.on('error', (e) => {\n reject(e);\n });\n });\n this.#httpRequest.on('error', (e) => {\n if (e instanceof CancelRequestError) {\n return;\n }\n reject(e);\n });\n }\n catch (e) {\n reject(e);\n }\n });\n }\n\n clear() {\n if (this.#tmpObj) this.#tmpObj.removeCallback();\n if (this.#url) this.#url = undefined;\n if (this.#httpRequest) this.#httpRequest = null;\n if (this.#filepath) this.#filepath = undefined;\n }\n}\n","import type { Stream } from 'stream';\nimport type { ReadStream } from 'fs';\nimport type {\n Frame\n} from 'beamcoder';\nimport beamcoder from 'beamcoder';\nimport { createImageData } from 'canvas';\nimport type { ImageData } from 'canvas';\nimport type {\n InterpolateMode,\n Extractor,\n ExtractorArgs\n} from '../../framefusion.js';\nimport {\n BaseExtractor\n} from '../BaseExtractor.js';\nimport { DownloadVideoURL } from '../DownloadVideoURL.js';\n\nconst LOG_PACKET_FLOW = false;\nconst LOG_SINGLE_FRAME_DUMP_FLOW = false;\n\n/**\n * Assumptions made by this library:\n *\n * - The input is always a mp4\n * It would be nice to support other formats. One thing to change is the iformat, hardcoded for mp4.\n *\n * - Stream 0 is the video stream we want to extract.\n * It would be good to detect cases where stream 0 is an audio stream an switch to the next stream.\n *\n */\nexport const probeCodecPar = codecpar => ({\n type: codecpar.type,\n codec_type: codecpar.codec_type,\n codec_id: codecpar.codec_id,\n name: codecpar.name,\n codec_tag: codecpar.codec_tag,\n extradata: codecpar.extradata,\n format: codecpar.format,\n bit_rate: codecpar.bit_rate,\n bits_per_coded_sample: codecpar.bits_per_coded_sample,\n bits_per_raw_sample: codecpar.bits_per_raw_sample,\n profile: codecpar.profile,\n level: codecpar.level,\n width: codecpar.width,\n height: codecpar.height,\n sample_aspect_ratio: codecpar.sample_aspect_ratio,\n field_order: codecpar.field_order,\n color_range: codecpar.color_range,\n color_primaries: codecpar.color_primaries,\n color_trc: codecpar.color_trc,\n color_space: codecpar.color_space,\n chroma_location: codecpar.chroma_location,\n video_delay: codecpar.video_delay,\n channel_layout: codecpar.channel_layout,\n channels: codecpar.channels,\n sample_rate: codecpar.sample_rate,\n block_align: codecpar.block_align,\n frame_size: codecpar.frame_size,\n initial_padding: codecpar.initial_padding,\n trailing_padding: codecpar.trailing_padding,\n seek_preroll: codecpar.seek_preroll,\n});\n\nexport const probeStream = stream => ({\n type: stream.type,\n index: stream.index,\n id: stream.id,\n time_base: stream.time_base,\n start_time: stream.start_time,\n duration: stream.duration,\n nb_frames: stream.nb_frames,\n disposition: stream.disposition,\n discard: stream.discard,\n sample_aspect_ratio: stream.sample_aspect_ratio,\n metadata: stream.metadata,\n avg_frame_rate: stream.avg_frame_rate,\n attached_pic: stream.attached_pic,\n side_data: stream.side_data,\n event_flags: stream.event_flags,\n r_frame_rate: stream.r_frame_rate,\n codecpar: probeCodecPar(stream.codecpar),\n});\n\n\n/**\n * A filter to convert between color spaces.\n * An example would be YUV to RGB, for mp4 to png conversion.\n */\nconst getFilter = async({\n stream,\n outputPixelFormat,\n interpolateFps,\n interpolateMode = 'fast',\n}: {\n stream: beamcoder.Stream;\n outputPixelFormat: string;\n interpolateFps?: number;\n interpolateMode?: InterpolateMode;\n}): Promise<beamcoder.Filterer> => {\n if (!stream.codecpar.format) {\n return null;\n }\n\n let filterSpec = [`[in0:v]format=${stream.codecpar.format}`];\n\n if (interpolateFps) {\n if (interpolateMode === 'high-quality') {\n filterSpec = [...filterSpec, `minterpolate=fps=${interpolateFps}`];\n }\n else if (interpolateMode === 'fast') {\n filterSpec = [...filterSpec, `fps=${interpolateFps}`];\n }\n else {\n throw new Error(`Unexpected interpolation mode: ${interpolateMode}`);\n }\n }\n\n filterSpec = [...filterSpec];\n\n const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n console.log(`filterSpec: ${filterSpecStr}`);\n\n return beamcoder.filterer({\n filterType: 'video',\n inputParams: [\n {\n name: 'in0:v',\n width: stream.codecpar.width,\n height: stream.codecpar.height,\n pixelFormat: stream.codecpar.format,\n timeBase: stream.time_base,\n pixelAspect: stream.sample_aspect_ratio,\n },\n ],\n outputParams: [\n {\n name: 'out0:v',\n pixelFormat: outputPixelFormat,\n },\n ],\n filterSpec: filterSpecStr,\n });\n};\n\n/**\n * Class to keep track of the muxer/demuxer/encoder/muxer used while extracting a video to frames.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n decoder: beamcoder.Decoder = null;\n demuxer: beamcoder.Demuxer = null;\n encoder: beamcoder.Encoder = null;\n muxer: beamcoder.Muxer = null;\n filterer: beamcoder.Filterer = null;\n packet: beamcoder.Packet;\n endTime: number;\n #locked: boolean;\n #targetPts = 0;\n demuxerStream: beamcoder.WritableDemuxerStream;\n readStream: ReadStream;\n lastFrame: beamcoder.Frame = null;\n filteredFrames: beamcoder.Frame[] = [];\n #streamStopped = false;\n #flushed = false;\n\n /**\n * Encoder/Decoder constuction is async, so it can't be put in a regular constructor.\n *\n * Use and await this method to generate an extactor.\n */\n static async create(args: ExtractorArgs): Promise<Extractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor as unknown as Extractor;\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n if (!inputFileOrUrl) {\n throw new Error('Can only use file OR url');\n }\n let readStream: Stream;\n let outputPixelFormat = 'rgba';\n\n console.log('init', { inputFileOrUrl, outputFile, threadCount, endTime, interpolateFps, interpolateMode, outputPixelFormat });\n\n //\n // - Demuxing -\n //\n // The demuxer reads the file and outputs packet streams\n //\n\n let demuxerStream;\n\n if (inputFileOrUrl.startsWith('http')) {\n console.log('downloading url');\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n console.log('finished downloading');\n }\n\n console.log('file mode');\n const demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n\n\n console.log({ time_base: demuxer.streams[0].time_base });\n\n //\n // - Decoding -\n //\n // The decoder reads packets and can output raw frame data\n //\n\n const decoder = beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[0].codecpar.width,\n height: demuxer.streams[0].codecpar.height,\n stream_index: 0,\n pix_fmt: demuxer.streams[0].codecpar.format,\n thread_count: threadCount,\n });\n\n let outputFormat: OutputFormats | null = null;\n\n if (outputFile) {\n ['png', 'tiff', 'mjpeg'].forEach(format => {\n if (outputFile.endsWith(format)) {\n outputFormat = format as OutputFormats;\n\n // TODO: build a map of outputFormats to outputPixelFormats and remove this from this loop.\n if (outputFormat === 'mjpeg') {\n outputPixelFormat = 'yuvj422p';\n }\n\n if (outputFormat === 'png') {\n outputPixelFormat = 'rgb24';\n }\n }\n });\n\n if (!outputFormat) {\n throw new Error('Output format could not be determined');\n }\n }\n\n //\n // - Filtering -\n //\n // Packets can be filtered to change colorspace, fps and add various effects\n // If there are no color space changes or filters, filter might not be necessary.\n //\n\n const filterer = await getFilter({\n stream: demuxer.streams[0],\n outputPixelFormat,\n interpolateFps,\n interpolateMode,\n });\n\n if (outputFormat) {\n //\n // - Encoding -\n //\n // Encode frames in packets of the output format\n //\n // This process is usually slower than decoding!\n const encoder = createFrameDumpingEncoder({\n decoder,\n outputFormat,\n thread_count: threadCount,\n });\n this.encoder = encoder;\n\n //\n // - Muxing -\n //\n // Assemble packets in a format that can be sent to the outside world!\n //\n\n // This process is usually slower than decoding!\n const muxer = await createFrameDumpingMuxer({\n thread_count: threadCount,\n filename: outputFile,\n sourceDemuxer: demuxer,\n });\n\n this.muxer = muxer;\n }\n\n this.decoder = decoder;\n this.demuxer = demuxer;\n this.filterer = filterer;\n this.endTime = endTime;\n this.demuxerStream = demuxerStream;\n this.readStream = readStream as ReadStream;\n }\n\n get duration(): number {\n const time_base = this.demuxer.streams[0].time_base;\n const durations = this.demuxer.streams.map(\n stream => stream.duration * time_base[0] / time_base[1]\n );\n\n return Math.max(...durations);\n }\n\n get width(): number {\n return this.demuxer.streams[0].codecpar.width;\n }\n\n get height(): number {\n return this.demuxer.streams[0].codecpar.height;\n }\n\n /**\n * Seek to a given PTS in the stream\n *\n * PTS stands for presentation time stamp. It's expressed in time_base units.\n * If timebase is 1/10000,\n * and a frame PTS is 10000,\n * Then the frame must be displayed at exactly 1 second.\n */\n async seekToPTS(targetPts: number) {\n if (targetPts === 0 && !this.packet) {\n // No need to seek, we haven't started reading yet.\n return;\n }\n this.lastFrame = null;\n this.#targetPts = targetPts;\n console.log(`Seeking to PTS=${targetPts}`);\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n await this.demuxer.seek({ stream_index: 0, timestamp: targetPts });\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n\n // When seeking to the past:\n // Skip any packets which were read before.\n // at a PTS bigger than the target PTS.\n while (this.packet && this.packet.pts > targetPts) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.packet.flags as any) = { DISCARD: true };\n await this.#nextPacket();\n }\n }\n\n\n /**\n * Dump one frame at a specific time\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n *\n * @see getFrameAtPts()\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n return this.getFrameAtPts(targetPts);\n }\n\n /**\n * Dump one frame's image data (for canvas) at a specific time\n *\n * @see getFrameAtTime()\n */\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n const frame = await this.getFrameAtPts(targetPts);\n\n const components = 4; // 4 components: r, g, b and a\n const size = frame.width * frame.height * components;\n const rawData = new Uint8ClampedArray(size);\n const sourceLineSize = frame.linesize as unknown as number;\n const pixels = frame.data[0] as Uint8Array;\n\n // libav creates larger buffers because it makes their internal code simpler.\n // we have to trim a part at the right of each pixel row.\n for (let i = 0; i < frame.height; i++) {\n const sourceStart = i * sourceLineSize;\n const sourceEnd = sourceStart + frame.width * components;\n const sourceData = pixels.slice(sourceStart, sourceEnd);\n const targetOffset = i * frame.width * components;\n rawData.set(sourceData, targetOffset);\n }\n\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n );\n\n return image;\n }\n\n /**\n * Dump one frame at a specific pts\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n */\n async getFrameAtPts(targetPts: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at PTS=${targetPts}`);\n\n if (this.packet) {\n const newTime = this.ptsToTime(targetPts);\n const currentTime = this.ptsToTime(this.lastFrame.pts);\n\n // Heuristic: if moving more than `SEEK_DELAY` away, seek instead\n // of processing packets until target. Note that this logic is not\n // good if playback rate is faster.\n const SEEK_DELAY = 2.0;\n if (Math.abs(newTime - currentTime) > SEEK_DELAY) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Time difference is bigger than SEEK_DELAY=${SEEK_DELAY}. Seeking.`);\n await this.seekToPTS(targetPts);\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n return this.lastFrame;\n }\n\n if (this.filteredFrames.length > 0 && targetPts < this.filteredFrames[0].pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Next frame is to be presented later (at PTS=${this.filteredFrames[0].pts}), resolving with last frame again, pts=${this.lastFrame.pts} [video fps is probably low]`);\n return this.lastFrame;\n }\n\n // TODO:\n // - Seek if we are:\n // - Seeking to the past;\n // - Seeking beyond the next keyframe. AND; - or some other heuristic,\n // such as seeking more than 1 seconds in the future.\n // - Clear last image when seeking.\n // - Clear extra frames when seeking\n\n // Read packets and dump a single frame.\n let finishReadingCleanlyPromise = null;\n\n const frame = await new Promise<beamcoder.Frame>(async resolve => {\n const onFrameAvailable = async(frame) => {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Frame available: pts=${frame.pts}`);\n\n // When we decoded the next frame after targetPts,\n // that's when we know the last frame was the one\n // that had to be shown at targetPts\n if (frame.pts === targetPts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts === targetPts | ', `${frame.pts} === ${targetPts} - resolving with this frame!`);\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n\n if (frame.pts > targetPts) {\n if (this.lastFrame) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - resolving with previous frame (PTS=${this.lastFrame.pts})!`);\n resolve(this.lastFrame);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n return false;\n }\n else {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - but no last frame available - resolving with frame!`);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n resolve(frame);\n return false;\n }\n\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts < targetPts | ', `${frame.pts} < ${targetPts} - continuing`);\n\n this.lastFrame = frame;\n\n return true;\n };\n\n finishReadingCleanlyPromise = this.readFrames({\n onFrameAvailable,\n flush: true,\n });\n\n await finishReadingCleanlyPromise;\n });\n\n await finishReadingCleanlyPromise;\n\n return frame;\n }\n\n\n /**\n * Seek to a given time in the stream\n */\n async seekToTime(targetTime: number) {\n await this.seekToPTS(this.timeToPts(targetTime));\n }\n\n /**\n * Convert a time (in seconds) to PTS (based on timebase)\n */\n timeToPts(time: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n /**\n * This just calls `this.demuxer.read()` with additional logging in case of errors.\n */\n async #readPacketWrapped() {\n if (this.#streamStopped) {\n throw new Error('Error: Trying to read after stream has stopped.');\n }\n try {\n const packet = await this.demuxer.read();\n if (!packet) {\n this.#streamStopped = true;\n }\n return packet;\n }\n catch (e) {\n throw e;\n }\n }\n\n async #nextPacket() {\n if (this.packet === null) {\n throw new Error('Stream is over!');\n }\n this.packet = await this.#readPacketWrapped();\n while (this.packet && this.packet.stream_index !== 0) {\n this.packet = await this.#readPacketWrapped();\n if (this.packet === null) {\n return;\n }\n }\n }\n\n async #skipToStream0PacketIfNotAlreadyStream0() {\n while (!this.packet || this.packet.stream_index !== 0) {\n await this.#nextPacket();\n }\n }\n\n async #filterFrames(frames) {\n const result = await this.filterer.filter([{\n name: 'in0:v',\n frames: frames,\n }]);\n this.filteredFrames = result.flatMap(r => r.frames);\n return this.filteredFrames;\n }\n\n /**\n * Note: the promise returned is for the first frame only.\n */\n async #processFilteredFrames(frames: Frame[] | null, {\n onFrameAvailable = () => true,\n }: {\n onFrameAvailable?: (frame: beamcoder.Frame) => boolean | Promise<boolean>;\n }) {\n let needsMore = true;\n\n while (this.filteredFrames.length > 0 && needsMore) {\n const frame = this.filteredFrames.shift();\n LOG_PACKET_FLOW && console.log(`Sending filter result to encoder PTS=${frame.pts}`);\n needsMore = await onFrameAvailable(frame);\n }\n\n return { needsMore };\n }\n\n async #muxImageResults(imageResult): Promise<void> {\n for (let j = 0; j < imageResult.packets.length; j++) {\n const shouldSave = !this.#targetPts || imageResult.packets[j].pts >= this.#targetPts;\n\n if (shouldSave) {\n await this.muxer.writeFrame(imageResult.packets[j]);\n LOG_PACKET_FLOW && console.log(`wrote image ${JSON.stringify(imageResult.packets[j])}`);\n }\n else {\n LOG_PACKET_FLOW && console.log(`skipped image ${JSON.stringify(imageResult.packets[j])}`);\n }\n }\n }\n\n async #filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n }: {\n decoderResult?: beamcoder.DecodedFrames;\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n const filteredFrames = await this.#filterFrames(decoderResult.frames);\n const { needsMore } = await this.#processFilteredFrames(filteredFrames, {\n onFrameAvailable,\n });\n\n return { needsMore };\n }\n\n async #readPacketLoop({\n onFrameAvailable,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }): Promise<{ needsMore: boolean; }> {\n await this.#nextPacket();\n while (this.packet) {\n const decoderResult = await this.decoder.decode(this.packet);\n LOG_PACKET_FLOW && console.log(`Received ${decoderResult.frames.length} decoder frames`);\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return { needsMore };\n }\n\n await this.#nextPacket();\n }\n\n return { needsMore: true };\n }\n\n /**\n * #hasEncoder\n *\n * Sometimes, we don't need to encode so we'll have no encoder.\n * (when reading raw frames, and no outputFile is given)\n * Otherwise, here we'll want to pass frames to the encoder as well\n * as running onFrameAvailable.\n */\n get #hasEncoder() {\n return this.encoder !== null;\n }\n\n async #flushEncoder() {\n if (!this.#hasEncoder) {\n return;\n }\n LOG_PACKET_FLOW && console.log(`\\n Flushing encoder`);\n const imageResult = await this.encoder.flush();\n await this.#muxImageResults(imageResult);\n }\n\n async #flushFilterAndProcessFrames({\n onFrameAvailable,\n }: {\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n LOG_PACKET_FLOW && console.log(`\\n Flushing decoder`);\n\n if (this.#flushed) {\n throw new Error('Already flushed');\n }\n\n this.#flushed = true;\n const decoderResult = await this.decoder.flush();\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return;\n }\n\n await this.#flushEncoder();\n }\n\n /**\n * Detect multiple access to beamcoder which could put our system in an unexpected state.\n */\n async withLock(callback) {\n if (this.#locked) {\n throw new Error('Multiple attempts to use beamcoder at the same time.');\n }\n this.#locked = true;\n await callback();\n this.#locked = false;\n }\n\n /**\n * Dump all frames from the current point.\n * Stops processing packets after target is reached.\n */\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n await this.withLock(async() => {\n const originalOnFrameAvailable = onFrameAvailable;\n\n if (this.#hasEncoder) {\n onFrameAvailable = async(frame): Promise<boolean> => {\n LOG_PACKET_FLOW && console.log(`About to encode ${frame.pts}.\\n`);\n const imageResult = await this.encoder.encode(frame);\n await this.#muxImageResults(imageResult);\n\n LOG_PACKET_FLOW && console.log(`About to run originalOnFrameAvailable.\\n`);\n const needsMore = await originalOnFrameAvailable(frame);\n\n return needsMore;\n };\n }\n\n // First output successively frames which were already decoded and filtered\n const needsMore = this.#processFilteredFrames([], { onFrameAvailable });\n if (!needsMore) {\n LOG_PACKET_FLOW && console.log('No need to read more after reading buffered frames.');\n return;\n }\n\n // Maybe after processing extra frames. there are no frames left, because\n // we already read the last packet the previous time around.\n if (this.packet === null) {\n return;\n }\n\n // Main reading loop\n // Most frame reading happens here.\n // We read packets, filter them and call onFrameAvailable to let the calling code\n // perform it's work.\n {\n const { needsMore } = await this.#readPacketLoop({ onFrameAvailable });\n if (!needsMore) {\n return;\n }\n }\n\n // Flushing.\n // After every packet has been read by the main loop, we need to get the\n // last packets from the decoder (flush) and repeat filtering and calling onFrameAvailable like the main loop.\n if (flush) {\n await this.#flushFilterAndProcessFrames({ onFrameAvailable });\n }\n\n LOG_PACKET_FLOW && console.log(`\\nRead frame ended.\\n`);\n });\n }\n\n async dispose() {\n await new Promise((resolve) => {\n setTimeout(() => {\n if (this.readStream) {\n // These might be creating memory issues.\n this.readStream.unpipe(this.demuxerStream);\n this.readStream.destroy();\n }\n }, 30);\n });\n }\n}\n\ntype OutputFormats = 'mjpeg' | 'png' | 'tiff';\n\nconst createFrameDumpingEncoder = ({\n decoder,\n outputFormat,\n thread_count,\n}: {\n decoder: beamcoder.Decoder;\n outputFormat: OutputFormats;\n thread_count: number;\n}) => {\n let colorspace = 'rgb24';\n if (outputFormat === 'mjpeg') {\n colorspace = 'yuvj422p';\n }\n\n return beamcoder.encoder({\n name: outputFormat,\n width: decoder.width,\n height: decoder.height,\n pix_fmt: colorspace,\n thread_count: thread_count,\n time_base: [1, 1],\n });\n};\n\nconst createFrameDumpingMuxer = async({\n filename,\n sourceDemuxer,\n thread_count,\n}: {\n filename: string;\n sourceDemuxer: beamcoder.Demuxer;\n thread_count: number;\n}) => {\n const demuxers = beamcoder.demuxers();\n // The iformat is necessary to have a working probe when using a stream\n const iformat = demuxers[Object.keys(demuxers).find(key => key.indexOf('mp4') > -1)];\n\n const muxer = beamcoder.muxer({\n name: 'image2',\n filename,\n thread_count: thread_count,\n iformat,\n });\n\n muxer.newStream(sourceDemuxer.streams[0]);\n await muxer.writeHeader();\n return muxer;\n};\n"],"names":["BaseExtractor","args","inputFileOrUrl","outputFile","threadCount","endTime","interpolateFps","interpolateMode","targetPts","targetTime","pts","onFrameAvailable","flush","CancelRequestError","DownloadVideoURL","url","__privateAdd","_url","_httpRequest","_filepath","_tmpObj","__privateSet","__privateGet","resolve","reject","source","extension","path","tmp","connectionHandler","https","http","res","contentType","err","writeStream","fs","e","getFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","beamcoder","_BeamcoderExtractor","_readPacketWrapped","_nextPacket","_skipToStream0PacketIfNotAlreadyStream0","_filterFrames","_processFilteredFrames","_muxImageResults","_filterAndProcessFrames","_readPacketLoop","_hasEncoder","_flushEncoder","_flushFilterAndProcessFrames","__publicField","_locked","_targetPts","_streamStopped","_flushed","extractor","readStream","demuxerStream","downloadUrl","demuxer","decoder","outputFormat","format","filterer","encoder","createFrameDumpingEncoder","muxer","createFrameDumpingMuxer","time_base","durations","__privateMethod","skipToStream0PacketIfNotAlreadyStream0_fn","nextPacket_fn","frame","components","size","rawData","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","createImageData","newTime","currentTime","SEEK_DELAY","finishReadingCleanlyPromise","time","callback","originalOnFrameAvailable","hasEncoder_get","imageResult","muxImageResults_fn","processFilteredFrames_fn","needsMore","readPacketLoop_fn","flushFilterAndProcessFrames_fn","BeamcoderExtractor","readPacketWrapped_fn","packet","filterFrames_fn","frames","result","j","filterAndProcessFrames_fn","decoderResult","filteredFrames","flushEncoder_fn","thread_count","colorspace","filename","sourceDemuxer","demuxers","iformat","key"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ import type { ImageData } from 'canvas';
2
3
  import { BeamcoderExtractor } from './src/backends/beamcoder.js';
3
4
  export type Frame = {
4
5
  pts: number;
@@ -21,6 +22,7 @@ export interface Extractor {
21
22
  get width(): number;
22
23
  get height(): number;
23
24
  getFrameAtTime(targetTime: number): Promise<Frame>;
25
+ getImageDataAtTime(targetTime: number): Promise<ImageData>;
24
26
  dispose(): Promise<void>;
25
27
  }
26
28
  export { BeamcoderExtractor };
@@ -46,6 +46,9 @@ class me {
46
46
  async getFrameAtTime(s) {
47
47
  throw new Error("Not implemented");
48
48
  }
49
+ async getImageDataAtTime(s) {
50
+ throw new Error("Not implemented");
51
+ }
49
52
  async getFrameAtPts(s) {
50
53
  throw new Error("Not implemented");
51
54
  }
@@ -73,12 +76,12 @@ class me {
73
76
  }
74
77
  class le extends Error {
75
78
  }
76
- var x, F, k, y;
79
+ var x, k, F, y;
77
80
  class de {
78
81
  constructor(s) {
79
82
  h(this, x, void 0);
80
- h(this, F, void 0);
81
83
  h(this, k, void 0);
84
+ h(this, F, void 0);
82
85
  h(this, y, void 0);
83
86
  d(this, x, s);
84
87
  }
@@ -86,7 +89,7 @@ class de {
86
89
  * returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined
87
90
  */
88
91
  get filepath() {
89
- return m(this, k);
92
+ return m(this, F);
90
93
  }
91
94
  /**
92
95
  * Downloads the file from the given URL. The file will be downloaded to a temporary file.
@@ -97,7 +100,7 @@ class de {
97
100
  d(this, y, he.fileSync({ postfix: r }));
98
101
  try {
99
102
  const a = t.startsWith("https://") ? ne : oe;
100
- d(this, F, a.get(t, (o) => {
103
+ d(this, k, a.get(t, (o) => {
101
104
  const n = o.headers["content-type"];
102
105
  if (!n.includes("video")) {
103
106
  const f = new Error(`Source ${t}, returned unsupported content type ${n}`);
@@ -106,11 +109,11 @@ class de {
106
109
  }
107
110
  const p = ce.createWriteStream(m(this, y).name);
108
111
  o.pipe(p), p.on("finish", () => {
109
- p.close(), d(this, k, m(this, y).name), s();
112
+ p.close(), d(this, F, m(this, y).name), s();
110
113
  }), p.on("error", (f) => {
111
114
  e(f);
112
115
  });
113
- })), m(this, F).on("error", (o) => {
116
+ })), m(this, k).on("error", (o) => {
114
117
  o instanceof le || e(o);
115
118
  });
116
119
  } catch (a) {
@@ -119,10 +122,10 @@ class de {
119
122
  });
120
123
  }
121
124
  clear() {
122
- m(this, y) && m(this, y).removeCallback(), m(this, x) && d(this, x, void 0), m(this, F) && d(this, F, null), m(this, k) && d(this, k, void 0);
125
+ m(this, y) && m(this, y).removeCallback(), m(this, x) && d(this, x, void 0), m(this, k) && d(this, k, null), m(this, F) && d(this, F, void 0);
123
126
  }
124
127
  }
125
- x = new WeakMap(), F = new WeakMap(), k = new WeakMap(), y = new WeakMap();
128
+ x = new WeakMap(), k = new WeakMap(), F = new WeakMap(), y = new WeakMap();
126
129
  const ue = async ({
127
130
  stream: i,
128
131
  outputPixelFormat: s,
@@ -162,7 +165,7 @@ const ue = async ({
162
165
  filterSpec: a
163
166
  });
164
167
  };
165
- var S, E, v, A, M, O, T, _, N, H, L, U, D, B, R, K, $, V, I, X, j, Y, W, Z, C, ee;
168
+ var S, E, v, A, M, O, T, _, N, H, I, U, D, B, R, K, $, V, L, X, j, Y, W, Z, C, ee;
166
169
  const G = class extends me {
167
170
  constructor() {
168
171
  super(...arguments);
@@ -172,14 +175,14 @@ const G = class extends me {
172
175
  h(this, M);
173
176
  h(this, T);
174
177
  h(this, N);
175
- h(this, L);
178
+ h(this, I);
176
179
  /**
177
180
  * Note: the promise returned is for the first frame only.
178
181
  */
179
182
  h(this, D);
180
183
  h(this, R);
181
184
  h(this, $);
182
- h(this, I);
185
+ h(this, L);
183
186
  /**
184
187
  * #hasEncoder
185
188
  *
@@ -317,7 +320,7 @@ const G = class extends me {
317
320
  *
318
321
  * @see getFrameAtTime()
319
322
  */
320
- async getFrameImageDataAtTime(e) {
323
+ async getImageDataAtTime(e) {
321
324
  const t = Math.floor(this.timeToPts(e)), r = await this.getFrameAtPts(t), a = 4, o = r.width * r.height * a, n = new Uint8ClampedArray(o), p = r.linesize, f = r.data[0];
322
325
  for (let l = 0; l < r.height; l++) {
323
326
  const P = l * p, g = P + r.width * a, q = f.slice(P, g), w = l * r.width * a;
@@ -403,7 +406,7 @@ const G = class extends me {
403
406
  return await c(this, R, K).call(this, n), await r(o);
404
407
  }), !!c(this, D, B).call(this, [], { onFrameAvailable: e }) && this.packet !== null) {
405
408
  {
406
- const { needsMore: o } = await c(this, I, X).call(this, { onFrameAvailable: e });
409
+ const { needsMore: o } = await c(this, L, X).call(this, { onFrameAvailable: e });
407
410
  if (!o)
408
411
  return;
409
412
  }
@@ -438,7 +441,7 @@ S = new WeakMap(), E = new WeakMap(), v = new WeakMap(), A = new WeakMap(), M =
438
441
  }, N = new WeakSet(), H = async function() {
439
442
  for (; !this.packet || this.packet.stream_index !== 0; )
440
443
  await c(this, T, _).call(this);
441
- }, L = new WeakSet(), U = async function(e) {
444
+ }, I = new WeakSet(), U = async function(e) {
442
445
  const t = await this.filterer.filter([{
443
446
  name: "in0:v",
444
447
  frames: e
@@ -460,11 +463,11 @@ S = new WeakMap(), E = new WeakMap(), v = new WeakMap(), A = new WeakMap(), M =
460
463
  decoderResult: e,
461
464
  onFrameAvailable: t
462
465
  }) {
463
- const r = await c(this, L, U).call(this, e.frames), { needsMore: a } = await c(this, D, B).call(this, r, {
466
+ const r = await c(this, I, U).call(this, e.frames), { needsMore: a } = await c(this, D, B).call(this, r, {
464
467
  onFrameAvailable: t
465
468
  });
466
469
  return { needsMore: a };
467
- }, I = new WeakSet(), X = async function({
470
+ }, L = new WeakSet(), X = async function({
468
471
  onFrameAvailable: e
469
472
  }) {
470
473
  for (await c(this, T, _).call(this); this.packet; ) {
@@ -1 +1 @@
1
- {"version":3,"file":"framefusion.es.js","sources":["../src/BaseExtractor.ts","../src/DownloadVideoURL.ts","../src/backends/beamcoder.ts"],"sourcesContent":["import type {\n ExtractorArgs,\n Frame,\n Extractor\n} from '../framefusion';\n\nexport class BaseExtractor implements Extractor {\n static async create(args: ExtractorArgs): Promise<Extractor> {\n throw new Error('Not implemented');\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n throw new Error('Not implemented');\n }\n\n get duration(): number {\n throw new Error('Not implemented');\n }\n\n get width(): number {\n throw new Error('Not implemented');\n }\n\n get height(): number {\n throw new Error('Not implemented');\n }\n\n async seekToPTS(targetPts: number) {\n throw new Error('Not implemented');\n }\n\n async getFrameAtTime(targetTime: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async getFrameAtPts(targetPts: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async seekToTime(targetTime: number) {\n throw new Error('Not implemented');\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n throw new Error('Not implemented');\n }\n\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n throw new Error('Not implemented');\n }\n\n async dispose() {\n throw new Error('Not implemented');\n }\n}\n","import path from 'path';\nimport https from 'node:https';\nimport type { ClientRequest } from 'http';\nimport http from 'http';\nimport tmp from 'tmp';\nimport fs from 'fs-extra';\n\nclass CancelRequestError extends Error { }\n\n/**\n * Downloads a video file from a given URL as a temporary file. When the object is cleared, the temporary file is\n * deleted.\n */\nexport class DownloadVideoURL {\n #url: string | undefined;\n #httpRequest: ClientRequest | undefined = undefined;\n #filepath: string | undefined = undefined;\n #tmpObj: tmp.SynchrounousResult | undefined = undefined;\n\n constructor(url) {\n this.#url = url;\n }\n\n /**\n * returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined\n */\n get filepath() {\n return this.#filepath;\n }\n\n /**\n * Downloads the file from the given URL. The file will be downloaded to a temporary file.\n */\n async download() {\n await new Promise<void>((resolve, reject) => {\n const source = this.#url;\n const extension = path.extname(source);\n this.#tmpObj = tmp.fileSync({ postfix: extension });\n try {\n const connectionHandler = source.startsWith('https://') ? https : http;\n this.#httpRequest = connectionHandler.get(source, (res) => {\n const contentType = res.headers['content-type'];\n if (!contentType.includes('video')) {\n const err = new Error(`Source ${source}, returned unsupported content type ${contentType}`);\n reject(err);\n return;\n }\n const writeStream = fs.createWriteStream(this.#tmpObj.name);\n res.pipe(writeStream);\n writeStream.on('finish', () => {\n writeStream.close();\n this.#filepath = this.#tmpObj.name;\n resolve();\n });\n writeStream.on('error', (e) => {\n reject(e);\n });\n });\n this.#httpRequest.on('error', (e) => {\n if (e instanceof CancelRequestError) {\n return;\n }\n reject(e);\n });\n }\n catch (e) {\n reject(e);\n }\n });\n }\n\n clear() {\n if (this.#tmpObj) this.#tmpObj.removeCallback();\n if (this.#url) this.#url = undefined;\n if (this.#httpRequest) this.#httpRequest = null;\n if (this.#filepath) this.#filepath = undefined;\n }\n}\n","import type { Stream } from 'stream';\nimport type { ReadStream } from 'fs';\nimport type {\n Frame\n} from 'beamcoder';\nimport beamcoder from 'beamcoder';\nimport { createImageData } from 'canvas';\nimport type { ImageData } from 'canvas';\nimport type {\n InterpolateMode,\n Extractor,\n ExtractorArgs\n} from '../../framefusion.js';\nimport {\n BaseExtractor\n} from '../BaseExtractor.js';\nimport { DownloadVideoURL } from '../DownloadVideoURL.js';\n\nconst LOG_PACKET_FLOW = false;\nconst LOG_SINGLE_FRAME_DUMP_FLOW = false;\n\n/**\n * Assumptions made by this library:\n *\n * - The input is always a mp4\n * It would be nice to support other formats. One thing to change is the iformat, hardcoded for mp4.\n *\n * - Stream 0 is the video stream we want to extract.\n * It would be good to detect cases where stream 0 is an audio stream an switch to the next stream.\n *\n */\nexport const probeCodecPar = codecpar => ({\n type: codecpar.type,\n codec_type: codecpar.codec_type,\n codec_id: codecpar.codec_id,\n name: codecpar.name,\n codec_tag: codecpar.codec_tag,\n extradata: codecpar.extradata,\n format: codecpar.format,\n bit_rate: codecpar.bit_rate,\n bits_per_coded_sample: codecpar.bits_per_coded_sample,\n bits_per_raw_sample: codecpar.bits_per_raw_sample,\n profile: codecpar.profile,\n level: codecpar.level,\n width: codecpar.width,\n height: codecpar.height,\n sample_aspect_ratio: codecpar.sample_aspect_ratio,\n field_order: codecpar.field_order,\n color_range: codecpar.color_range,\n color_primaries: codecpar.color_primaries,\n color_trc: codecpar.color_trc,\n color_space: codecpar.color_space,\n chroma_location: codecpar.chroma_location,\n video_delay: codecpar.video_delay,\n channel_layout: codecpar.channel_layout,\n channels: codecpar.channels,\n sample_rate: codecpar.sample_rate,\n block_align: codecpar.block_align,\n frame_size: codecpar.frame_size,\n initial_padding: codecpar.initial_padding,\n trailing_padding: codecpar.trailing_padding,\n seek_preroll: codecpar.seek_preroll,\n});\n\nexport const probeStream = stream => ({\n type: stream.type,\n index: stream.index,\n id: stream.id,\n time_base: stream.time_base,\n start_time: stream.start_time,\n duration: stream.duration,\n nb_frames: stream.nb_frames,\n disposition: stream.disposition,\n discard: stream.discard,\n sample_aspect_ratio: stream.sample_aspect_ratio,\n metadata: stream.metadata,\n avg_frame_rate: stream.avg_frame_rate,\n attached_pic: stream.attached_pic,\n side_data: stream.side_data,\n event_flags: stream.event_flags,\n r_frame_rate: stream.r_frame_rate,\n codecpar: probeCodecPar(stream.codecpar),\n});\n\n\n/**\n * A filter to convert between color spaces.\n * An example would be YUV to RGB, for mp4 to png conversion.\n */\nconst getFilter = async({\n stream,\n outputPixelFormat,\n interpolateFps,\n interpolateMode = 'fast',\n}: {\n stream: beamcoder.Stream;\n outputPixelFormat: string;\n interpolateFps?: number;\n interpolateMode?: InterpolateMode;\n}): Promise<beamcoder.Filterer> => {\n if (!stream.codecpar.format) {\n return null;\n }\n\n let filterSpec = [`[in0:v]format=${stream.codecpar.format}`];\n\n if (interpolateFps) {\n if (interpolateMode === 'high-quality') {\n filterSpec = [...filterSpec, `minterpolate=fps=${interpolateFps}`];\n }\n else if (interpolateMode === 'fast') {\n filterSpec = [...filterSpec, `fps=${interpolateFps}`];\n }\n else {\n throw new Error(`Unexpected interpolation mode: ${interpolateMode}`);\n }\n }\n\n filterSpec = [...filterSpec];\n\n const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n console.log(`filterSpec: ${filterSpecStr}`);\n\n return beamcoder.filterer({\n filterType: 'video',\n inputParams: [\n {\n name: 'in0:v',\n width: stream.codecpar.width,\n height: stream.codecpar.height,\n pixelFormat: stream.codecpar.format,\n timeBase: stream.time_base,\n pixelAspect: stream.sample_aspect_ratio,\n },\n ],\n outputParams: [\n {\n name: 'out0:v',\n pixelFormat: outputPixelFormat,\n },\n ],\n filterSpec: filterSpecStr,\n });\n};\n\n/**\n * Class to keep track of the muxer/demuxer/encoder/muxer used while extracting a video to frames.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n decoder: beamcoder.Decoder = null;\n demuxer: beamcoder.Demuxer = null;\n encoder: beamcoder.Encoder = null;\n muxer: beamcoder.Muxer = null;\n filterer: beamcoder.Filterer = null;\n packet: beamcoder.Packet;\n endTime: number;\n #locked: boolean;\n #targetPts = 0;\n demuxerStream: beamcoder.WritableDemuxerStream;\n readStream: ReadStream;\n lastFrame: beamcoder.Frame = null;\n filteredFrames: beamcoder.Frame[] = [];\n #streamStopped = false;\n #flushed = false;\n\n /**\n * Encoder/Decoder constuction is async, so it can't be put in a regular constructor.\n *\n * Use and await this method to generate an extactor.\n */\n static async create(args: ExtractorArgs): Promise<Extractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor as unknown as Extractor;\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n if (!inputFileOrUrl) {\n throw new Error('Can only use file OR url');\n }\n let readStream: Stream;\n let outputPixelFormat = 'rgba';\n\n console.log('init', { inputFileOrUrl, outputFile, threadCount, endTime, interpolateFps, interpolateMode, outputPixelFormat });\n\n //\n // - Demuxing -\n //\n // The demuxer reads the file and outputs packet streams\n //\n\n let demuxerStream;\n\n if (inputFileOrUrl.startsWith('http')) {\n console.log('downloading url');\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n console.log('finished downloading');\n }\n\n console.log('file mode');\n const demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n\n\n console.log({ time_base: demuxer.streams[0].time_base });\n\n //\n // - Decoding -\n //\n // The decoder reads packets and can output raw frame data\n //\n\n const decoder = beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[0].codecpar.width,\n height: demuxer.streams[0].codecpar.height,\n stream_index: 0,\n pix_fmt: demuxer.streams[0].codecpar.format,\n thread_count: threadCount,\n });\n\n let outputFormat: OutputFormats | null = null;\n\n if (outputFile) {\n ['png', 'tiff', 'mjpeg'].forEach(format => {\n if (outputFile.endsWith(format)) {\n outputFormat = format as OutputFormats;\n\n // TODO: build a map of outputFormats to outputPixelFormats and remove this from this loop.\n if (outputFormat === 'mjpeg') {\n outputPixelFormat = 'yuvj422p';\n }\n\n if (outputFormat === 'png') {\n outputPixelFormat = 'rgb24';\n }\n }\n });\n\n if (!outputFormat) {\n throw new Error('Output format could not be determined');\n }\n }\n\n //\n // - Filtering -\n //\n // Packets can be filtered to change colorspace, fps and add various effects\n // If there are no color space changes or filters, filter might not be necessary.\n //\n\n const filterer = await getFilter({\n stream: demuxer.streams[0],\n outputPixelFormat,\n interpolateFps,\n interpolateMode,\n });\n\n if (outputFormat) {\n //\n // - Encoding -\n //\n // Encode frames in packets of the output format\n //\n // This process is usually slower than decoding!\n const encoder = createFrameDumpingEncoder({\n decoder,\n outputFormat,\n thread_count: threadCount,\n });\n this.encoder = encoder;\n\n //\n // - Muxing -\n //\n // Assemble packets in a format that can be sent to the outside world!\n //\n\n // This process is usually slower than decoding!\n const muxer = await createFrameDumpingMuxer({\n thread_count: threadCount,\n filename: outputFile,\n sourceDemuxer: demuxer,\n });\n\n this.muxer = muxer;\n }\n\n this.decoder = decoder;\n this.demuxer = demuxer;\n this.filterer = filterer;\n this.endTime = endTime;\n this.demuxerStream = demuxerStream;\n this.readStream = readStream as ReadStream;\n }\n\n get duration(): number {\n const time_base = this.demuxer.streams[0].time_base;\n const durations = this.demuxer.streams.map(\n stream => stream.duration * time_base[0] / time_base[1]\n );\n\n return Math.max(...durations);\n }\n\n get width(): number {\n return this.demuxer.streams[0].codecpar.width;\n }\n\n get height(): number {\n return this.demuxer.streams[0].codecpar.height;\n }\n\n /**\n * Seek to a given PTS in the stream\n *\n * PTS stands for presentation time stamp. It's expressed in time_base units.\n * If timebase is 1/10000,\n * and a frame PTS is 10000,\n * Then the frame must be displayed at exactly 1 second.\n */\n async seekToPTS(targetPts: number) {\n if (targetPts === 0 && !this.packet) {\n // No need to seek, we haven't started reading yet.\n return;\n }\n this.lastFrame = null;\n this.#targetPts = targetPts;\n console.log(`Seeking to PTS=${targetPts}`);\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n await this.demuxer.seek({ stream_index: 0, timestamp: targetPts });\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n\n // When seeking to the past:\n // Skip any packets which were read before.\n // at a PTS bigger than the target PTS.\n while (this.packet && this.packet.pts > targetPts) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.packet.flags as any) = { DISCARD: true };\n await this.#nextPacket();\n }\n }\n\n\n /**\n * Dump one frame at a specific time\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n *\n * @see getFrameAtPts()\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n return this.getFrameAtPts(targetPts);\n }\n\n /**\n * Dump one frame's image data (for canvas) at a specific time\n *\n * @see getFrameAtTime()\n */\n async getFrameImageDataAtTime(targetTime: number): Promise<ImageData> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n const frame = await this.getFrameAtPts(targetPts);\n\n const components = 4; // 4 components: r, g, b and a\n const size = frame.width * frame.height * components;\n const rawData = new Uint8ClampedArray(size);\n const sourceLineSize = frame.linesize as unknown as number;\n const pixels = frame.data[0] as Uint8Array;\n\n // libav creates larger buffers because it makes their internal code simpler.\n // we have to trim a part at the right of each pixel row.\n for (let i = 0; i < frame.height; i++) {\n const sourceStart = i * sourceLineSize;\n const sourceEnd = sourceStart + frame.width * components;\n const sourceData = pixels.slice(sourceStart, sourceEnd);\n const targetOffset = i * frame.width * components;\n rawData.set(sourceData, targetOffset);\n }\n\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n );\n\n return image;\n }\n\n /**\n * Dump one frame at a specific pts\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n */\n async getFrameAtPts(targetPts: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at PTS=${targetPts}`);\n\n if (this.packet) {\n const newTime = this.ptsToTime(targetPts);\n const currentTime = this.ptsToTime(this.lastFrame.pts);\n\n // Heuristic: if moving more than `SEEK_DELAY` away, seek instead\n // of processing packets until target. Note that this logic is not\n // good if playback rate is faster.\n const SEEK_DELAY = 2.0;\n if (Math.abs(newTime - currentTime) > SEEK_DELAY) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Time difference is bigger than SEEK_DELAY=${SEEK_DELAY}. Seeking.`);\n await this.seekToPTS(targetPts);\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n return this.lastFrame;\n }\n\n if (this.filteredFrames.length > 0 && targetPts < this.filteredFrames[0].pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Next frame is to be presented later (at PTS=${this.filteredFrames[0].pts}), resolving with last frame again, pts=${this.lastFrame.pts} [video fps is probably low]`);\n return this.lastFrame;\n }\n\n // TODO:\n // - Seek if we are:\n // - Seeking to the past;\n // - Seeking beyond the next keyframe. AND; - or some other heuristic,\n // such as seeking more than 1 seconds in the future.\n // - Clear last image when seeking.\n // - Clear extra frames when seeking\n\n // Read packets and dump a single frame.\n let finishReadingCleanlyPromise = null;\n\n const frame = await new Promise<beamcoder.Frame>(async resolve => {\n const onFrameAvailable = async(frame) => {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Frame available: pts=${frame.pts}`);\n\n // When we decoded the next frame after targetPts,\n // that's when we know the last frame was the one\n // that had to be shown at targetPts\n if (frame.pts === targetPts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts === targetPts | ', `${frame.pts} === ${targetPts} - resolving with this frame!`);\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n\n if (frame.pts > targetPts) {\n if (this.lastFrame) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - resolving with previous frame (PTS=${this.lastFrame.pts})!`);\n resolve(this.lastFrame);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n return false;\n }\n else {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - but no last frame available - resolving with frame!`);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n resolve(frame);\n return false;\n }\n\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts < targetPts | ', `${frame.pts} < ${targetPts} - continuing`);\n\n this.lastFrame = frame;\n\n return true;\n };\n\n finishReadingCleanlyPromise = this.readFrames({\n onFrameAvailable,\n flush: true,\n });\n\n await finishReadingCleanlyPromise;\n });\n\n await finishReadingCleanlyPromise;\n\n return frame;\n }\n\n\n /**\n * Seek to a given time in the stream\n */\n async seekToTime(targetTime: number) {\n await this.seekToPTS(this.timeToPts(targetTime));\n }\n\n /**\n * Convert a time (in seconds) to PTS (based on timebase)\n */\n timeToPts(time: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n /**\n * This just calls `this.demuxer.read()` with additional logging in case of errors.\n */\n async #readPacketWrapped() {\n if (this.#streamStopped) {\n throw new Error('Error: Trying to read after stream has stopped.');\n }\n try {\n const packet = await this.demuxer.read();\n if (!packet) {\n this.#streamStopped = true;\n }\n return packet;\n }\n catch (e) {\n throw e;\n }\n }\n\n async #nextPacket() {\n if (this.packet === null) {\n throw new Error('Stream is over!');\n }\n this.packet = await this.#readPacketWrapped();\n while (this.packet && this.packet.stream_index !== 0) {\n this.packet = await this.#readPacketWrapped();\n if (this.packet === null) {\n return;\n }\n }\n }\n\n async #skipToStream0PacketIfNotAlreadyStream0() {\n while (!this.packet || this.packet.stream_index !== 0) {\n await this.#nextPacket();\n }\n }\n\n async #filterFrames(frames) {\n const result = await this.filterer.filter([{\n name: 'in0:v',\n frames: frames,\n }]);\n this.filteredFrames = result.flatMap(r => r.frames);\n return this.filteredFrames;\n }\n\n /**\n * Note: the promise returned is for the first frame only.\n */\n async #processFilteredFrames(frames: Frame[] | null, {\n onFrameAvailable = () => true,\n }: {\n onFrameAvailable?: (frame: beamcoder.Frame) => boolean | Promise<boolean>;\n }) {\n let needsMore = true;\n\n while (this.filteredFrames.length > 0 && needsMore) {\n const frame = this.filteredFrames.shift();\n LOG_PACKET_FLOW && console.log(`Sending filter result to encoder PTS=${frame.pts}`);\n needsMore = await onFrameAvailable(frame);\n }\n\n return { needsMore };\n }\n\n async #muxImageResults(imageResult): Promise<void> {\n for (let j = 0; j < imageResult.packets.length; j++) {\n const shouldSave = !this.#targetPts || imageResult.packets[j].pts >= this.#targetPts;\n\n if (shouldSave) {\n await this.muxer.writeFrame(imageResult.packets[j]);\n LOG_PACKET_FLOW && console.log(`wrote image ${JSON.stringify(imageResult.packets[j])}`);\n }\n else {\n LOG_PACKET_FLOW && console.log(`skipped image ${JSON.stringify(imageResult.packets[j])}`);\n }\n }\n }\n\n async #filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n }: {\n decoderResult?: beamcoder.DecodedFrames;\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n const filteredFrames = await this.#filterFrames(decoderResult.frames);\n const { needsMore } = await this.#processFilteredFrames(filteredFrames, {\n onFrameAvailable,\n });\n\n return { needsMore };\n }\n\n async #readPacketLoop({\n onFrameAvailable,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }): Promise<{ needsMore: boolean; }> {\n await this.#nextPacket();\n while (this.packet) {\n const decoderResult = await this.decoder.decode(this.packet);\n LOG_PACKET_FLOW && console.log(`Received ${decoderResult.frames.length} decoder frames`);\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return { needsMore };\n }\n\n await this.#nextPacket();\n }\n\n return { needsMore: true };\n }\n\n /**\n * #hasEncoder\n *\n * Sometimes, we don't need to encode so we'll have no encoder.\n * (when reading raw frames, and no outputFile is given)\n * Otherwise, here we'll want to pass frames to the encoder as well\n * as running onFrameAvailable.\n */\n get #hasEncoder() {\n return this.encoder !== null;\n }\n\n async #flushEncoder() {\n if (!this.#hasEncoder) {\n return;\n }\n LOG_PACKET_FLOW && console.log(`\\n Flushing encoder`);\n const imageResult = await this.encoder.flush();\n await this.#muxImageResults(imageResult);\n }\n\n async #flushFilterAndProcessFrames({\n onFrameAvailable,\n }: {\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n LOG_PACKET_FLOW && console.log(`\\n Flushing decoder`);\n\n if (this.#flushed) {\n throw new Error('Already flushed');\n }\n\n this.#flushed = true;\n const decoderResult = await this.decoder.flush();\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return;\n }\n\n await this.#flushEncoder();\n }\n\n /**\n * Detect multiple access to beamcoder which could put our system in an unexpected state.\n */\n async withLock(callback) {\n if (this.#locked) {\n throw new Error('Multiple attempts to use beamcoder at the same time.');\n }\n this.#locked = true;\n await callback();\n this.#locked = false;\n }\n\n /**\n * Dump all frames from the current point.\n * Stops processing packets after target is reached.\n */\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n await this.withLock(async() => {\n const originalOnFrameAvailable = onFrameAvailable;\n\n if (this.#hasEncoder) {\n onFrameAvailable = async(frame): Promise<boolean> => {\n LOG_PACKET_FLOW && console.log(`About to encode ${frame.pts}.\\n`);\n const imageResult = await this.encoder.encode(frame);\n await this.#muxImageResults(imageResult);\n\n LOG_PACKET_FLOW && console.log(`About to run originalOnFrameAvailable.\\n`);\n const needsMore = await originalOnFrameAvailable(frame);\n\n return needsMore;\n };\n }\n\n // First output successively frames which were already decoded and filtered\n const needsMore = this.#processFilteredFrames([], { onFrameAvailable });\n if (!needsMore) {\n LOG_PACKET_FLOW && console.log('No need to read more after reading buffered frames.');\n return;\n }\n\n // Maybe after processing extra frames. there are no frames left, because\n // we already read the last packet the previous time around.\n if (this.packet === null) {\n return;\n }\n\n // Main reading loop\n // Most frame reading happens here.\n // We read packets, filter them and call onFrameAvailable to let the calling code\n // perform it's work.\n {\n const { needsMore } = await this.#readPacketLoop({ onFrameAvailable });\n if (!needsMore) {\n return;\n }\n }\n\n // Flushing.\n // After every packet has been read by the main loop, we need to get the\n // last packets from the decoder (flush) and repeat filtering and calling onFrameAvailable like the main loop.\n if (flush) {\n await this.#flushFilterAndProcessFrames({ onFrameAvailable });\n }\n\n LOG_PACKET_FLOW && console.log(`\\nRead frame ended.\\n`);\n });\n }\n\n async dispose() {\n await new Promise((resolve) => {\n setTimeout(() => {\n if (this.readStream) {\n // These might be creating memory issues.\n this.readStream.unpipe(this.demuxerStream);\n this.readStream.destroy();\n }\n }, 30);\n });\n }\n}\n\ntype OutputFormats = 'mjpeg' | 'png' | 'tiff';\n\nconst createFrameDumpingEncoder = ({\n decoder,\n outputFormat,\n thread_count,\n}: {\n decoder: beamcoder.Decoder;\n outputFormat: OutputFormats;\n thread_count: number;\n}) => {\n let colorspace = 'rgb24';\n if (outputFormat === 'mjpeg') {\n colorspace = 'yuvj422p';\n }\n\n return beamcoder.encoder({\n name: outputFormat,\n width: decoder.width,\n height: decoder.height,\n pix_fmt: colorspace,\n thread_count: thread_count,\n time_base: [1, 1],\n });\n};\n\nconst createFrameDumpingMuxer = async({\n filename,\n sourceDemuxer,\n thread_count,\n}: {\n filename: string;\n sourceDemuxer: beamcoder.Demuxer;\n thread_count: number;\n}) => {\n const demuxers = beamcoder.demuxers();\n // The iformat is necessary to have a working probe when using a stream\n const iformat = demuxers[Object.keys(demuxers).find(key => key.indexOf('mp4') > -1)];\n\n const muxer = beamcoder.muxer({\n name: 'image2',\n filename,\n thread_count: thread_count,\n iformat,\n });\n\n muxer.newStream(sourceDemuxer.streams[0]);\n await muxer.writeHeader();\n return muxer;\n};\n"],"names":["BaseExtractor","args","inputFileOrUrl","outputFile","threadCount","endTime","interpolateFps","interpolateMode","targetPts","targetTime","pts","onFrameAvailable","flush","CancelRequestError","DownloadVideoURL","url","__privateAdd","_url","_httpRequest","_filepath","_tmpObj","__privateSet","__privateGet","resolve","reject","source","extension","path","tmp","connectionHandler","https","http","res","contentType","err","writeStream","fs","e","getFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","beamcoder","_BeamcoderExtractor","_readPacketWrapped","_nextPacket","_skipToStream0PacketIfNotAlreadyStream0","_filterFrames","_processFilteredFrames","_muxImageResults","_filterAndProcessFrames","_readPacketLoop","_hasEncoder","_flushEncoder","_flushFilterAndProcessFrames","__publicField","_locked","_targetPts","_streamStopped","_flushed","extractor","readStream","demuxerStream","downloadUrl","demuxer","decoder","outputFormat","format","filterer","encoder","createFrameDumpingEncoder","muxer","createFrameDumpingMuxer","time_base","durations","__privateMethod","skipToStream0PacketIfNotAlreadyStream0_fn","nextPacket_fn","frame","components","size","rawData","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","createImageData","newTime","currentTime","SEEK_DELAY","finishReadingCleanlyPromise","time","callback","originalOnFrameAvailable","hasEncoder_get","imageResult","muxImageResults_fn","processFilteredFrames_fn","needsMore","readPacketLoop_fn","flushFilterAndProcessFrames_fn","BeamcoderExtractor","readPacketWrapped_fn","packet","filterFrames_fn","frames","result","j","filterAndProcessFrames_fn","decoderResult","filteredFrames","flushEncoder_fn","thread_count","colorspace","filename","sourceDemuxer","demuxers","iformat","key"],"mappings":"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"}
1
+ {"version":3,"file":"framefusion.es.js","sources":["../src/BaseExtractor.ts","../src/DownloadVideoURL.ts","../src/backends/beamcoder.ts"],"sourcesContent":["import type { ImageData } from 'canvas';\n\nimport type {\n ExtractorArgs,\n Frame,\n Extractor\n} from '../framefusion';\n\nexport class BaseExtractor implements Extractor {\n static async create(args: ExtractorArgs): Promise<Extractor> {\n throw new Error('Not implemented');\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n throw new Error('Not implemented');\n }\n\n get duration(): number {\n throw new Error('Not implemented');\n }\n\n get width(): number {\n throw new Error('Not implemented');\n }\n\n get height(): number {\n throw new Error('Not implemented');\n }\n\n async seekToPTS(targetPts: number) {\n throw new Error('Not implemented');\n }\n\n async getFrameAtTime(targetTime: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n throw new Error('Not implemented');\n }\n\n async getFrameAtPts(targetPts: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async seekToTime(targetTime: number) {\n throw new Error('Not implemented');\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n throw new Error('Not implemented');\n }\n\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n throw new Error('Not implemented');\n }\n\n async dispose() {\n throw new Error('Not implemented');\n }\n}\n","import path from 'path';\nimport https from 'node:https';\nimport type { ClientRequest } from 'http';\nimport http from 'http';\nimport tmp from 'tmp';\nimport fs from 'fs-extra';\n\nclass CancelRequestError extends Error { }\n\n/**\n * Downloads a video file from a given URL as a temporary file. When the object is cleared, the temporary file is\n * deleted.\n */\nexport class DownloadVideoURL {\n #url: string | undefined;\n #httpRequest: ClientRequest | undefined = undefined;\n #filepath: string | undefined = undefined;\n #tmpObj: tmp.SynchrounousResult | undefined = undefined;\n\n constructor(url) {\n this.#url = url;\n }\n\n /**\n * returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined\n */\n get filepath() {\n return this.#filepath;\n }\n\n /**\n * Downloads the file from the given URL. The file will be downloaded to a temporary file.\n */\n async download() {\n await new Promise<void>((resolve, reject) => {\n const source = this.#url;\n const extension = path.extname(source);\n this.#tmpObj = tmp.fileSync({ postfix: extension });\n try {\n const connectionHandler = source.startsWith('https://') ? https : http;\n this.#httpRequest = connectionHandler.get(source, (res) => {\n const contentType = res.headers['content-type'];\n if (!contentType.includes('video')) {\n const err = new Error(`Source ${source}, returned unsupported content type ${contentType}`);\n reject(err);\n return;\n }\n const writeStream = fs.createWriteStream(this.#tmpObj.name);\n res.pipe(writeStream);\n writeStream.on('finish', () => {\n writeStream.close();\n this.#filepath = this.#tmpObj.name;\n resolve();\n });\n writeStream.on('error', (e) => {\n reject(e);\n });\n });\n this.#httpRequest.on('error', (e) => {\n if (e instanceof CancelRequestError) {\n return;\n }\n reject(e);\n });\n }\n catch (e) {\n reject(e);\n }\n });\n }\n\n clear() {\n if (this.#tmpObj) this.#tmpObj.removeCallback();\n if (this.#url) this.#url = undefined;\n if (this.#httpRequest) this.#httpRequest = null;\n if (this.#filepath) this.#filepath = undefined;\n }\n}\n","import type { Stream } from 'stream';\nimport type { ReadStream } from 'fs';\nimport type {\n Frame\n} from 'beamcoder';\nimport beamcoder from 'beamcoder';\nimport { createImageData } from 'canvas';\nimport type { ImageData } from 'canvas';\nimport type {\n InterpolateMode,\n Extractor,\n ExtractorArgs\n} from '../../framefusion.js';\nimport {\n BaseExtractor\n} from '../BaseExtractor.js';\nimport { DownloadVideoURL } from '../DownloadVideoURL.js';\n\nconst LOG_PACKET_FLOW = false;\nconst LOG_SINGLE_FRAME_DUMP_FLOW = false;\n\n/**\n * Assumptions made by this library:\n *\n * - The input is always a mp4\n * It would be nice to support other formats. One thing to change is the iformat, hardcoded for mp4.\n *\n * - Stream 0 is the video stream we want to extract.\n * It would be good to detect cases where stream 0 is an audio stream an switch to the next stream.\n *\n */\nexport const probeCodecPar = codecpar => ({\n type: codecpar.type,\n codec_type: codecpar.codec_type,\n codec_id: codecpar.codec_id,\n name: codecpar.name,\n codec_tag: codecpar.codec_tag,\n extradata: codecpar.extradata,\n format: codecpar.format,\n bit_rate: codecpar.bit_rate,\n bits_per_coded_sample: codecpar.bits_per_coded_sample,\n bits_per_raw_sample: codecpar.bits_per_raw_sample,\n profile: codecpar.profile,\n level: codecpar.level,\n width: codecpar.width,\n height: codecpar.height,\n sample_aspect_ratio: codecpar.sample_aspect_ratio,\n field_order: codecpar.field_order,\n color_range: codecpar.color_range,\n color_primaries: codecpar.color_primaries,\n color_trc: codecpar.color_trc,\n color_space: codecpar.color_space,\n chroma_location: codecpar.chroma_location,\n video_delay: codecpar.video_delay,\n channel_layout: codecpar.channel_layout,\n channels: codecpar.channels,\n sample_rate: codecpar.sample_rate,\n block_align: codecpar.block_align,\n frame_size: codecpar.frame_size,\n initial_padding: codecpar.initial_padding,\n trailing_padding: codecpar.trailing_padding,\n seek_preroll: codecpar.seek_preroll,\n});\n\nexport const probeStream = stream => ({\n type: stream.type,\n index: stream.index,\n id: stream.id,\n time_base: stream.time_base,\n start_time: stream.start_time,\n duration: stream.duration,\n nb_frames: stream.nb_frames,\n disposition: stream.disposition,\n discard: stream.discard,\n sample_aspect_ratio: stream.sample_aspect_ratio,\n metadata: stream.metadata,\n avg_frame_rate: stream.avg_frame_rate,\n attached_pic: stream.attached_pic,\n side_data: stream.side_data,\n event_flags: stream.event_flags,\n r_frame_rate: stream.r_frame_rate,\n codecpar: probeCodecPar(stream.codecpar),\n});\n\n\n/**\n * A filter to convert between color spaces.\n * An example would be YUV to RGB, for mp4 to png conversion.\n */\nconst getFilter = async({\n stream,\n outputPixelFormat,\n interpolateFps,\n interpolateMode = 'fast',\n}: {\n stream: beamcoder.Stream;\n outputPixelFormat: string;\n interpolateFps?: number;\n interpolateMode?: InterpolateMode;\n}): Promise<beamcoder.Filterer> => {\n if (!stream.codecpar.format) {\n return null;\n }\n\n let filterSpec = [`[in0:v]format=${stream.codecpar.format}`];\n\n if (interpolateFps) {\n if (interpolateMode === 'high-quality') {\n filterSpec = [...filterSpec, `minterpolate=fps=${interpolateFps}`];\n }\n else if (interpolateMode === 'fast') {\n filterSpec = [...filterSpec, `fps=${interpolateFps}`];\n }\n else {\n throw new Error(`Unexpected interpolation mode: ${interpolateMode}`);\n }\n }\n\n filterSpec = [...filterSpec];\n\n const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n console.log(`filterSpec: ${filterSpecStr}`);\n\n return beamcoder.filterer({\n filterType: 'video',\n inputParams: [\n {\n name: 'in0:v',\n width: stream.codecpar.width,\n height: stream.codecpar.height,\n pixelFormat: stream.codecpar.format,\n timeBase: stream.time_base,\n pixelAspect: stream.sample_aspect_ratio,\n },\n ],\n outputParams: [\n {\n name: 'out0:v',\n pixelFormat: outputPixelFormat,\n },\n ],\n filterSpec: filterSpecStr,\n });\n};\n\n/**\n * Class to keep track of the muxer/demuxer/encoder/muxer used while extracting a video to frames.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n decoder: beamcoder.Decoder = null;\n demuxer: beamcoder.Demuxer = null;\n encoder: beamcoder.Encoder = null;\n muxer: beamcoder.Muxer = null;\n filterer: beamcoder.Filterer = null;\n packet: beamcoder.Packet;\n endTime: number;\n #locked: boolean;\n #targetPts = 0;\n demuxerStream: beamcoder.WritableDemuxerStream;\n readStream: ReadStream;\n lastFrame: beamcoder.Frame = null;\n filteredFrames: beamcoder.Frame[] = [];\n #streamStopped = false;\n #flushed = false;\n\n /**\n * Encoder/Decoder constuction is async, so it can't be put in a regular constructor.\n *\n * Use and await this method to generate an extactor.\n */\n static async create(args: ExtractorArgs): Promise<Extractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor as unknown as Extractor;\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n if (!inputFileOrUrl) {\n throw new Error('Can only use file OR url');\n }\n let readStream: Stream;\n let outputPixelFormat = 'rgba';\n\n console.log('init', { inputFileOrUrl, outputFile, threadCount, endTime, interpolateFps, interpolateMode, outputPixelFormat });\n\n //\n // - Demuxing -\n //\n // The demuxer reads the file and outputs packet streams\n //\n\n let demuxerStream;\n\n if (inputFileOrUrl.startsWith('http')) {\n console.log('downloading url');\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n console.log('finished downloading');\n }\n\n console.log('file mode');\n const demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n\n\n console.log({ time_base: demuxer.streams[0].time_base });\n\n //\n // - Decoding -\n //\n // The decoder reads packets and can output raw frame data\n //\n\n const decoder = beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[0].codecpar.width,\n height: demuxer.streams[0].codecpar.height,\n stream_index: 0,\n pix_fmt: demuxer.streams[0].codecpar.format,\n thread_count: threadCount,\n });\n\n let outputFormat: OutputFormats | null = null;\n\n if (outputFile) {\n ['png', 'tiff', 'mjpeg'].forEach(format => {\n if (outputFile.endsWith(format)) {\n outputFormat = format as OutputFormats;\n\n // TODO: build a map of outputFormats to outputPixelFormats and remove this from this loop.\n if (outputFormat === 'mjpeg') {\n outputPixelFormat = 'yuvj422p';\n }\n\n if (outputFormat === 'png') {\n outputPixelFormat = 'rgb24';\n }\n }\n });\n\n if (!outputFormat) {\n throw new Error('Output format could not be determined');\n }\n }\n\n //\n // - Filtering -\n //\n // Packets can be filtered to change colorspace, fps and add various effects\n // If there are no color space changes or filters, filter might not be necessary.\n //\n\n const filterer = await getFilter({\n stream: demuxer.streams[0],\n outputPixelFormat,\n interpolateFps,\n interpolateMode,\n });\n\n if (outputFormat) {\n //\n // - Encoding -\n //\n // Encode frames in packets of the output format\n //\n // This process is usually slower than decoding!\n const encoder = createFrameDumpingEncoder({\n decoder,\n outputFormat,\n thread_count: threadCount,\n });\n this.encoder = encoder;\n\n //\n // - Muxing -\n //\n // Assemble packets in a format that can be sent to the outside world!\n //\n\n // This process is usually slower than decoding!\n const muxer = await createFrameDumpingMuxer({\n thread_count: threadCount,\n filename: outputFile,\n sourceDemuxer: demuxer,\n });\n\n this.muxer = muxer;\n }\n\n this.decoder = decoder;\n this.demuxer = demuxer;\n this.filterer = filterer;\n this.endTime = endTime;\n this.demuxerStream = demuxerStream;\n this.readStream = readStream as ReadStream;\n }\n\n get duration(): number {\n const time_base = this.demuxer.streams[0].time_base;\n const durations = this.demuxer.streams.map(\n stream => stream.duration * time_base[0] / time_base[1]\n );\n\n return Math.max(...durations);\n }\n\n get width(): number {\n return this.demuxer.streams[0].codecpar.width;\n }\n\n get height(): number {\n return this.demuxer.streams[0].codecpar.height;\n }\n\n /**\n * Seek to a given PTS in the stream\n *\n * PTS stands for presentation time stamp. It's expressed in time_base units.\n * If timebase is 1/10000,\n * and a frame PTS is 10000,\n * Then the frame must be displayed at exactly 1 second.\n */\n async seekToPTS(targetPts: number) {\n if (targetPts === 0 && !this.packet) {\n // No need to seek, we haven't started reading yet.\n return;\n }\n this.lastFrame = null;\n this.#targetPts = targetPts;\n console.log(`Seeking to PTS=${targetPts}`);\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n await this.demuxer.seek({ stream_index: 0, timestamp: targetPts });\n await this.#skipToStream0PacketIfNotAlreadyStream0();\n\n // When seeking to the past:\n // Skip any packets which were read before.\n // at a PTS bigger than the target PTS.\n while (this.packet && this.packet.pts > targetPts) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this.packet.flags as any) = { DISCARD: true };\n await this.#nextPacket();\n }\n }\n\n\n /**\n * Dump one frame at a specific time\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n *\n * @see getFrameAtPts()\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n return this.getFrameAtPts(targetPts);\n }\n\n /**\n * Dump one frame's image data (for canvas) at a specific time\n *\n * @see getFrameAtTime()\n */\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);\n const targetPts = Math.floor(this.timeToPts(targetTime));\n const frame = await this.getFrameAtPts(targetPts);\n\n const components = 4; // 4 components: r, g, b and a\n const size = frame.width * frame.height * components;\n const rawData = new Uint8ClampedArray(size);\n const sourceLineSize = frame.linesize as unknown as number;\n const pixels = frame.data[0] as Uint8Array;\n\n // libav creates larger buffers because it makes their internal code simpler.\n // we have to trim a part at the right of each pixel row.\n for (let i = 0; i < frame.height; i++) {\n const sourceStart = i * sourceLineSize;\n const sourceEnd = sourceStart + frame.width * components;\n const sourceData = pixels.slice(sourceStart, sourceEnd);\n const targetOffset = i * frame.width * components;\n rawData.set(sourceData, targetOffset);\n }\n\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n );\n\n return image;\n }\n\n /**\n * Dump one frame at a specific pts\n *\n * This method can seek as required, but generally, it is designed to be\n * performant in the cases where we progressively read a video frame by frame.\n *\n * So the implementation in here should not seek all the time, but rather\n * read packets as they come, when possible,\n */\n async getFrameAtPts(targetPts: number): Promise<beamcoder.Frame> {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at PTS=${targetPts}`);\n\n if (this.packet) {\n const newTime = this.ptsToTime(targetPts);\n const currentTime = this.ptsToTime(this.lastFrame.pts);\n\n // Heuristic: if moving more than `SEEK_DELAY` away, seek instead\n // of processing packets until target. Note that this logic is not\n // good if playback rate is faster.\n const SEEK_DELAY = 2.0;\n if (Math.abs(newTime - currentTime) > SEEK_DELAY) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Time difference is bigger than SEEK_DELAY=${SEEK_DELAY}. Seeking.`);\n await this.seekToPTS(targetPts);\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n return this.lastFrame;\n }\n\n if (this.filteredFrames.length > 0 && targetPts < this.filteredFrames[0].pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Next frame is to be presented later (at PTS=${this.filteredFrames[0].pts}), resolving with last frame again, pts=${this.lastFrame.pts} [video fps is probably low]`);\n return this.lastFrame;\n }\n\n // TODO:\n // - Seek if we are:\n // - Seeking to the past;\n // - Seeking beyond the next keyframe. AND; - or some other heuristic,\n // such as seeking more than 1 seconds in the future.\n // - Clear last image when seeking.\n // - Clear extra frames when seeking\n\n // Read packets and dump a single frame.\n let finishReadingCleanlyPromise = null;\n\n const frame = await new Promise<beamcoder.Frame>(async resolve => {\n const onFrameAvailable = async(frame) => {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Frame available: pts=${frame.pts}`);\n\n // When we decoded the next frame after targetPts,\n // that's when we know the last frame was the one\n // that had to be shown at targetPts\n if (frame.pts === targetPts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts === targetPts | ', `${frame.pts} === ${targetPts} - resolving with this frame!`);\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n\n if (frame.pts > targetPts) {\n if (this.lastFrame) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - resolving with previous frame (PTS=${this.lastFrame.pts})!`);\n resolve(this.lastFrame);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n return false;\n }\n else {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts > targetPts | ', `${frame.pts} > ${targetPts} - but no last frame available - resolving with frame!`);\n // Add this frame back to the buffer - we don't need it yet.\n this.filteredFrames = [frame, ...this.filteredFrames];\n this.lastFrame = frame;\n resolve(frame);\n return false;\n }\n }\n\n if (this.packet === null && this.filteredFrames.length === 0 && targetPts >= this.lastFrame.pts) {\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Last frame has been reached, resolving with last frame, pts=${this.lastFrame.pts}`);\n resolve(frame);\n return false;\n }\n\n LOG_SINGLE_FRAME_DUMP_FLOW && console.log('frame.pts < targetPts | ', `${frame.pts} < ${targetPts} - continuing`);\n\n this.lastFrame = frame;\n\n return true;\n };\n\n finishReadingCleanlyPromise = this.readFrames({\n onFrameAvailable,\n flush: true,\n });\n\n await finishReadingCleanlyPromise;\n });\n\n await finishReadingCleanlyPromise;\n\n return frame;\n }\n\n\n /**\n * Seek to a given time in the stream\n */\n async seekToTime(targetTime: number) {\n await this.seekToPTS(this.timeToPts(targetTime));\n }\n\n /**\n * Convert a time (in seconds) to PTS (based on timebase)\n */\n timeToPts(time: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n const time_base = this.demuxer.streams[0].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n /**\n * This just calls `this.demuxer.read()` with additional logging in case of errors.\n */\n async #readPacketWrapped() {\n if (this.#streamStopped) {\n throw new Error('Error: Trying to read after stream has stopped.');\n }\n try {\n const packet = await this.demuxer.read();\n if (!packet) {\n this.#streamStopped = true;\n }\n return packet;\n }\n catch (e) {\n throw e;\n }\n }\n\n async #nextPacket() {\n if (this.packet === null) {\n throw new Error('Stream is over!');\n }\n this.packet = await this.#readPacketWrapped();\n while (this.packet && this.packet.stream_index !== 0) {\n this.packet = await this.#readPacketWrapped();\n if (this.packet === null) {\n return;\n }\n }\n }\n\n async #skipToStream0PacketIfNotAlreadyStream0() {\n while (!this.packet || this.packet.stream_index !== 0) {\n await this.#nextPacket();\n }\n }\n\n async #filterFrames(frames) {\n const result = await this.filterer.filter([{\n name: 'in0:v',\n frames: frames,\n }]);\n this.filteredFrames = result.flatMap(r => r.frames);\n return this.filteredFrames;\n }\n\n /**\n * Note: the promise returned is for the first frame only.\n */\n async #processFilteredFrames(frames: Frame[] | null, {\n onFrameAvailable = () => true,\n }: {\n onFrameAvailable?: (frame: beamcoder.Frame) => boolean | Promise<boolean>;\n }) {\n let needsMore = true;\n\n while (this.filteredFrames.length > 0 && needsMore) {\n const frame = this.filteredFrames.shift();\n LOG_PACKET_FLOW && console.log(`Sending filter result to encoder PTS=${frame.pts}`);\n needsMore = await onFrameAvailable(frame);\n }\n\n return { needsMore };\n }\n\n async #muxImageResults(imageResult): Promise<void> {\n for (let j = 0; j < imageResult.packets.length; j++) {\n const shouldSave = !this.#targetPts || imageResult.packets[j].pts >= this.#targetPts;\n\n if (shouldSave) {\n await this.muxer.writeFrame(imageResult.packets[j]);\n LOG_PACKET_FLOW && console.log(`wrote image ${JSON.stringify(imageResult.packets[j])}`);\n }\n else {\n LOG_PACKET_FLOW && console.log(`skipped image ${JSON.stringify(imageResult.packets[j])}`);\n }\n }\n }\n\n async #filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n }: {\n decoderResult?: beamcoder.DecodedFrames;\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n const filteredFrames = await this.#filterFrames(decoderResult.frames);\n const { needsMore } = await this.#processFilteredFrames(filteredFrames, {\n onFrameAvailable,\n });\n\n return { needsMore };\n }\n\n async #readPacketLoop({\n onFrameAvailable,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }): Promise<{ needsMore: boolean; }> {\n await this.#nextPacket();\n while (this.packet) {\n const decoderResult = await this.decoder.decode(this.packet);\n LOG_PACKET_FLOW && console.log(`Received ${decoderResult.frames.length} decoder frames`);\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return { needsMore };\n }\n\n await this.#nextPacket();\n }\n\n return { needsMore: true };\n }\n\n /**\n * #hasEncoder\n *\n * Sometimes, we don't need to encode so we'll have no encoder.\n * (when reading raw frames, and no outputFile is given)\n * Otherwise, here we'll want to pass frames to the encoder as well\n * as running onFrameAvailable.\n */\n get #hasEncoder() {\n return this.encoder !== null;\n }\n\n async #flushEncoder() {\n if (!this.#hasEncoder) {\n return;\n }\n LOG_PACKET_FLOW && console.log(`\\n Flushing encoder`);\n const imageResult = await this.encoder.flush();\n await this.#muxImageResults(imageResult);\n }\n\n async #flushFilterAndProcessFrames({\n onFrameAvailable,\n }: {\n onFrameAvailable: (frame: Frame) => Promise<boolean> | boolean;\n }) {\n LOG_PACKET_FLOW && console.log(`\\n Flushing decoder`);\n\n if (this.#flushed) {\n throw new Error('Already flushed');\n }\n\n this.#flushed = true;\n const decoderResult = await this.decoder.flush();\n const { needsMore } = await this.#filterAndProcessFrames({\n decoderResult,\n onFrameAvailable,\n });\n\n if (!needsMore) {\n return;\n }\n\n await this.#flushEncoder();\n }\n\n /**\n * Detect multiple access to beamcoder which could put our system in an unexpected state.\n */\n async withLock(callback) {\n if (this.#locked) {\n throw new Error('Multiple attempts to use beamcoder at the same time.');\n }\n this.#locked = true;\n await callback();\n this.#locked = false;\n }\n\n /**\n * Dump all frames from the current point.\n * Stops processing packets after target is reached.\n */\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n await this.withLock(async() => {\n const originalOnFrameAvailable = onFrameAvailable;\n\n if (this.#hasEncoder) {\n onFrameAvailable = async(frame): Promise<boolean> => {\n LOG_PACKET_FLOW && console.log(`About to encode ${frame.pts}.\\n`);\n const imageResult = await this.encoder.encode(frame);\n await this.#muxImageResults(imageResult);\n\n LOG_PACKET_FLOW && console.log(`About to run originalOnFrameAvailable.\\n`);\n const needsMore = await originalOnFrameAvailable(frame);\n\n return needsMore;\n };\n }\n\n // First output successively frames which were already decoded and filtered\n const needsMore = this.#processFilteredFrames([], { onFrameAvailable });\n if (!needsMore) {\n LOG_PACKET_FLOW && console.log('No need to read more after reading buffered frames.');\n return;\n }\n\n // Maybe after processing extra frames. there are no frames left, because\n // we already read the last packet the previous time around.\n if (this.packet === null) {\n return;\n }\n\n // Main reading loop\n // Most frame reading happens here.\n // We read packets, filter them and call onFrameAvailable to let the calling code\n // perform it's work.\n {\n const { needsMore } = await this.#readPacketLoop({ onFrameAvailable });\n if (!needsMore) {\n return;\n }\n }\n\n // Flushing.\n // After every packet has been read by the main loop, we need to get the\n // last packets from the decoder (flush) and repeat filtering and calling onFrameAvailable like the main loop.\n if (flush) {\n await this.#flushFilterAndProcessFrames({ onFrameAvailable });\n }\n\n LOG_PACKET_FLOW && console.log(`\\nRead frame ended.\\n`);\n });\n }\n\n async dispose() {\n await new Promise((resolve) => {\n setTimeout(() => {\n if (this.readStream) {\n // These might be creating memory issues.\n this.readStream.unpipe(this.demuxerStream);\n this.readStream.destroy();\n }\n }, 30);\n });\n }\n}\n\ntype OutputFormats = 'mjpeg' | 'png' | 'tiff';\n\nconst createFrameDumpingEncoder = ({\n decoder,\n outputFormat,\n thread_count,\n}: {\n decoder: beamcoder.Decoder;\n outputFormat: OutputFormats;\n thread_count: number;\n}) => {\n let colorspace = 'rgb24';\n if (outputFormat === 'mjpeg') {\n colorspace = 'yuvj422p';\n }\n\n return beamcoder.encoder({\n name: outputFormat,\n width: decoder.width,\n height: decoder.height,\n pix_fmt: colorspace,\n thread_count: thread_count,\n time_base: [1, 1],\n });\n};\n\nconst createFrameDumpingMuxer = async({\n filename,\n sourceDemuxer,\n thread_count,\n}: {\n filename: string;\n sourceDemuxer: beamcoder.Demuxer;\n thread_count: number;\n}) => {\n const demuxers = beamcoder.demuxers();\n // The iformat is necessary to have a working probe when using a stream\n const iformat = demuxers[Object.keys(demuxers).find(key => key.indexOf('mp4') > -1)];\n\n const muxer = beamcoder.muxer({\n name: 'image2',\n filename,\n thread_count: thread_count,\n iformat,\n });\n\n muxer.newStream(sourceDemuxer.streams[0]);\n await muxer.writeHeader();\n return muxer;\n};\n"],"names":["BaseExtractor","args","inputFileOrUrl","outputFile","threadCount","endTime","interpolateFps","interpolateMode","targetPts","targetTime","pts","onFrameAvailable","flush","CancelRequestError","DownloadVideoURL","url","__privateAdd","_url","_httpRequest","_filepath","_tmpObj","__privateSet","__privateGet","resolve","reject","source","extension","path","tmp","connectionHandler","https","http","res","contentType","err","writeStream","fs","e","getFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","beamcoder","_BeamcoderExtractor","_readPacketWrapped","_nextPacket","_skipToStream0PacketIfNotAlreadyStream0","_filterFrames","_processFilteredFrames","_muxImageResults","_filterAndProcessFrames","_readPacketLoop","_hasEncoder","_flushEncoder","_flushFilterAndProcessFrames","__publicField","_locked","_targetPts","_streamStopped","_flushed","extractor","readStream","demuxerStream","downloadUrl","demuxer","decoder","outputFormat","format","filterer","encoder","createFrameDumpingEncoder","muxer","createFrameDumpingMuxer","time_base","durations","__privateMethod","skipToStream0PacketIfNotAlreadyStream0_fn","nextPacket_fn","frame","components","size","rawData","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","createImageData","newTime","currentTime","SEEK_DELAY","finishReadingCleanlyPromise","time","callback","originalOnFrameAvailable","hasEncoder_get","imageResult","muxImageResults_fn","processFilteredFrames_fn","needsMore","readPacketLoop_fn","flushFilterAndProcessFrames_fn","BeamcoderExtractor","readPacketWrapped_fn","packet","filterFrames_fn","frames","result","j","filterAndProcessFrames_fn","decoderResult","filteredFrames","flushEncoder_fn","thread_count","colorspace","filename","sourceDemuxer","demuxers","iformat","key"],"mappings":"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"}
@@ -21,7 +21,7 @@ import { BeamcoderExtractor } from './src/backends/beamcoder.js';
21
21
  // inputFileOrUrl: TEST_VIDEO,
22
22
  // });
23
23
  //
24
- // const frame = await extractor.getFrameImageDataAtTime(0.3);
24
+ // const frame = await extractor.getImageDataAtTime(0.3);
25
25
  // console.log(frame);
26
26
  // extractor.dispose();
27
27
  // };
@@ -1 +1 @@
1
- {"version":3,"file":"framefusion.js","sourceRoot":"","sources":["../framefusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAuCjE,EAAE;AACF,iBAAiB;AACjB,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,mBAAmB;AACnB,EAAE;AACF,qCAAqC;AACrC,EAAE;AACF,qBAAqB;AACrB,EAAE;AACF,6EAA6E;AAC7E,EAAE;AACF,WAAW;AACX,EAAE;AACF,6CAA6C;AAC7C,kCAAkC;AAClC,iBAAiB;AACjB,0DAA0D;AAC1D,sCAAsC;AACtC,UAAU;AACV,EAAE;AACF,kEAAkE;AAClE,0BAA0B;AAC1B,2BAA2B;AAC3B,KAAK;AACL,EAAE;AACF,SAAS;AACT,EAAE;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"framefusion.js","sourceRoot":"","sources":["../framefusion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAyCjE,EAAE;AACF,iBAAiB;AACjB,EAAE;AACF,+DAA+D;AAC/D,EAAE;AACF,mBAAmB;AACnB,EAAE;AACF,qCAAqC;AACrC,EAAE;AACF,qBAAqB;AACrB,EAAE;AACF,6EAA6E;AAC7E,EAAE;AACF,WAAW;AACX,EAAE;AACF,6CAA6C;AAC7C,kCAAkC;AAClC,iBAAiB;AACjB,0DAA0D;AAC1D,sCAAsC;AACtC,UAAU;AACV,EAAE;AACF,6DAA6D;AAC7D,0BAA0B;AAC1B,2BAA2B;AAC3B,KAAK;AACL,EAAE;AACF,SAAS;AACT,EAAE;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { ImageData } from 'canvas';
1
2
  import type { ExtractorArgs, Frame, Extractor } from '../framefusion';
2
3
  export declare class BaseExtractor implements Extractor {
3
4
  static create(args: ExtractorArgs): Promise<Extractor>;
@@ -7,6 +8,7 @@ export declare class BaseExtractor implements Extractor {
7
8
  get height(): number;
8
9
  seekToPTS(targetPts: number): Promise<void>;
9
10
  getFrameAtTime(targetTime: number): Promise<Frame>;
11
+ getImageDataAtTime(targetTime: number): Promise<ImageData>;
10
12
  getFrameAtPts(targetPts: number): Promise<Frame>;
11
13
  seekToTime(targetTime: number): Promise<void>;
12
14
  /**
@@ -20,6 +20,9 @@ export class BaseExtractor {
20
20
  async getFrameAtTime(targetTime) {
21
21
  throw new Error('Not implemented');
22
22
  }
23
+ async getImageDataAtTime(targetTime) {
24
+ throw new Error('Not implemented');
25
+ }
23
26
  async getFrameAtPts(targetPts) {
24
27
  throw new Error('Not implemented');
25
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BaseExtractor.js","sourceRoot":"","sources":["../../src/BaseExtractor.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,aAAa;IACtB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAmB;QACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACP,cAAc,EACd,UAAU,EACV,WAAW,GAAG,CAAC,EACf,OAAO,EACP,cAAc,EACd,eAAe,GACH;QACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,QAAQ;QACR,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,KAAK;QACL,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,MAAM;QACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB;QAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB;QACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACjC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB;QAC/B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EACb,gBAAgB,EAChB,KAAK,GAAG,IAAI,MAOZ;QACA,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;KAC/B;QACG,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;CACJ"}
1
+ {"version":3,"file":"BaseExtractor.js","sourceRoot":"","sources":["../../src/BaseExtractor.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,aAAa;IACtB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAmB;QACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACP,cAAc,EACd,UAAU,EACV,WAAW,GAAG,CAAC,EACf,OAAO,EACP,cAAc,EACd,eAAe,GACH;QACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,QAAQ;QACR,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,KAAK;QACL,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,MAAM;QACN,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB;QAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB;QACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACvC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACjC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB;QAC/B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EACb,gBAAgB,EAChB,KAAK,GAAG,IAAI,MAOZ;QACA,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;KAC/B;QACG,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;CACJ"}
@@ -149,7 +149,7 @@ export declare class BeamcoderExtractor extends BaseExtractor implements Extract
149
149
  *
150
150
  * @see getFrameAtTime()
151
151
  */
152
- getFrameImageDataAtTime(targetTime: number): Promise<ImageData>;
152
+ getImageDataAtTime(targetTime: number): Promise<ImageData>;
153
153
  /**
154
154
  * Dump one frame at a specific pts
155
155
  *
@@ -297,7 +297,7 @@ export class BeamcoderExtractor extends BaseExtractor {
297
297
  *
298
298
  * @see getFrameAtTime()
299
299
  */
300
- async getFrameImageDataAtTime(targetTime) {
300
+ async getImageDataAtTime(targetTime) {
301
301
  LOG_SINGLE_FRAME_DUMP_FLOW && console.log(`Requesting to dump a frame at Time(s)=${targetTime}`);
302
302
  const targetPts = Math.floor(this.timeToPts(targetTime));
303
303
  const frame = await this.getFrameAtPts(targetPts);
@@ -1 +1 @@
1
- {"version":3,"file":"beamcoder.js","sourceRoot":"","sources":["../../../src/backends/beamcoder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"beamcoder.js","sourceRoot":"","sources":["../../../src/backends/beamcoder.ts"],"names":[],"mappings":"AAKA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAOzC,OAAO,EACH,aAAa,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAEzC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtC,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;IAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;IAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;IAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;IACrD,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;IACjD,OAAO,EAAE,QAAQ,CAAC,OAAO;IACzB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;IACvB,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;IACjD,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;IACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;IAC7B,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;IACzC,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,cAAc,EAAE,QAAQ,CAAC,cAAc;IACvC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;IAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;IACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;IAC/B,eAAe,EAAE,QAAQ,CAAC,eAAe;IACzC,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;IAC3C,YAAY,EAAE,QAAQ,CAAC,YAAY;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,EAAE,EAAE,MAAM,CAAC,EAAE;IACb,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;IAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;IAC/C,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,cAAc,EAAE,MAAM,CAAC,cAAc;IACrC,YAAY,EAAE,MAAM,CAAC,YAAY;IACjC,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;IAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;IACjC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;CAC3C,CAAC,CAAC;AAGH;;;GAGG;AACH,MAAM,SAAS,GAAG,KAAK,EAAC,EACpB,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,eAAe,GAAG,MAAM,GAM3B,EAA+B,EAAE;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,UAAU,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7D,IAAI,cAAc,EAAE;QAChB,IAAI,eAAe,KAAK,cAAc,EAAE;YACpC,UAAU,GAAG,CAAC,GAAG,UAAU,EAAE,oBAAoB,cAAc,EAAE,CAAC,CAAC;SACtE;aACI,IAAI,eAAe,KAAK,MAAM,EAAE;YACjC,UAAU,GAAG,CAAC,GAAG,UAAU,EAAE,OAAO,cAAc,EAAE,CAAC,CAAC;SACzD;aACI;YACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,eAAe,EAAE,CAAC,CAAC;SACxE;KACJ;IAED,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;IAE7B,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;IAEzD,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;IAE5C,OAAO,SAAS,CAAC,QAAQ,CAAC;QACtB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE;YACT;gBACI,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;gBAC5B,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBAC9B,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBACnC,QAAQ,EAAE,MAAM,CAAC,SAAS;gBAC1B,WAAW,EAAE,MAAM,CAAC,mBAAmB;aAC1C;SACJ;QACD,YAAY,EAAE;YACV;gBACI,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iBAAiB;aACjC;SACJ;QACD,UAAU,EAAE,aAAa;KAC5B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACjD,OAAO,GAAsB,IAAI,CAAC;IAClC,OAAO,GAAsB,IAAI,CAAC;IAClC,OAAO,GAAsB,IAAI,CAAC;IAClC,KAAK,GAAoB,IAAI,CAAC;IAC9B,QAAQ,GAAuB,IAAI,CAAC;IACpC,MAAM,CAAmB;IACzB,OAAO,CAAS;IAChB,OAAO,CAAU;IACjB,UAAU,GAAG,CAAC,CAAC;IACf,aAAa,CAAkC;IAC/C,UAAU,CAAa;IACvB,SAAS,GAAoB,IAAI,CAAC;IAClC,cAAc,GAAsB,EAAE,CAAC;IACvC,cAAc,GAAG,KAAK,CAAC;IACvB,QAAQ,GAAG,KAAK,CAAC;IAEjB;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAmB;QACnC,MAAM,SAAS,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,SAAiC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACP,cAAc,EACd,UAAU,EACV,WAAW,GAAG,CAAC,EACf,OAAO,EACP,cAAc,EACd,eAAe,GACH;QACZ,IAAI,CAAC,cAAc,EAAE;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC/C;QACD,IAAI,UAAkB,CAAC;QACvB,IAAI,iBAAiB,GAAG,MAAM,CAAC;QAE/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE9H,EAAE;QACF,oBAAoB;QACpB,EAAE;QACF,4DAA4D;QAC5D,EAAE;QAEF,IAAI,aAAa,CAAC;QAElB,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC,cAAc,CAAC,CAAC;YACzD,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;SACvC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;QAGlE,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAEzD,EAAE;QACF,oBAAoB;QACpB,EAAE;QACF,+DAA+D;QAC/D,EAAE;QAEF,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;YAC9B,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;YACxC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;YAC1C,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;YAC3C,YAAY,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,IAAI,YAAY,GAAyB,IAAI,CAAC;QAE9C,IAAI,UAAU,EAAE;YACZ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACtC,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAC7B,YAAY,GAAG,MAAuB,CAAC;oBAEvC,2FAA2F;oBAC3F,IAAI,YAAY,KAAK,OAAO,EAAE;wBAC1B,iBAAiB,GAAG,UAAU,CAAC;qBAClC;oBAED,IAAI,YAAY,KAAK,KAAK,EAAE;wBACxB,iBAAiB,GAAG,OAAO,CAAC;qBAC/B;iBACJ;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,EAAE;gBACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;aAC5D;SACJ;QAED,EAAE;QACF,oBAAoB;QACpB,EAAE;QACF,gFAAgF;QAChF,qFAAqF;QACrF,EAAE;QAEF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;YAC7B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1B,iBAAiB;YACjB,cAAc;YACd,eAAe;SAClB,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE;YACd,EAAE;YACF,mBAAmB;YACnB,EAAE;YACF,oDAAoD;YACpD,EAAE;YACF,gDAAgD;YAChD,MAAM,OAAO,GAAG,yBAAyB,CAAC;gBACtC,OAAO;gBACP,YAAY;gBACZ,YAAY,EAAE,WAAW;aAC5B,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YAEvB,EAAE;YACF,iBAAiB;YACjB,EAAE;YACF,0EAA0E;YAC1E,EAAE;YAEF,gDAAgD;YAChD,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC;gBACxC,YAAY,EAAE,WAAW;gBACzB,QAAQ,EAAE,UAAU;gBACpB,aAAa,EAAE,OAAO;aACzB,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;SACtB;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAwB,CAAC;IAC/C,CAAC;IAED,IAAI,QAAQ;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CACtC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAC1D,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IAClD,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IACnD,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CAAC,SAAiB;QAC7B,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACjC,mDAAmD;YACnD,OAAO;SACV;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,uCAAuC,EAAE,CAAC;QACrD,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,uCAAuC,EAAE,CAAC;QAErD,4BAA4B;QAC5B,2CAA2C;QAC3C,uCAAuC;QACvC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,EAAE;YAC/C,8DAA8D;YAC7D,IAAI,CAAC,MAAM,CAAC,KAAa,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;SAC5B;IACL,CAAC;IAGD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACnC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;QACjG,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACvC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;QACjG,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,8BAA8B;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,QAA6B,CAAC;QAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAe,CAAC;QAE3C,6EAA6E;QAC7E,yDAAyD;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,WAAW,GAAG,CAAC,GAAG,cAAc,CAAC;YACvC,MAAM,SAAS,GAAG,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;YACzD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;SACzC;QAED,MAAM,KAAK,GAAG,eAAe,CACzB,OAAO,EACP,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,CACf,CAAC;QAEF,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB;QACjC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;QAE5F,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAEvD,iEAAiE;YACjE,kEAAkE;YAClE,mCAAmC;YACnC,MAAM,UAAU,GAAG,GAAG,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,UAAU,EAAE;gBAC9C,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,6CAA6C,UAAU,YAAY,CAAC,CAAC;gBAC/G,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;aACnC;SACJ;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7F,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,+DAA+D,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/H,OAAO,IAAI,CAAC,SAAS,CAAC;SACzB;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;YAC1E,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,+CAA+C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,2CAA2C,IAAI,CAAC,SAAS,CAAC,GAAG,8BAA8B,CAAC,CAAC;YAChN,OAAO,IAAI,CAAC,SAAS,CAAC;SACzB;QAED,QAAQ;QACR,wBAAwB;QACxB,iCAAiC;QACjC,8EAA8E;QAC9E,+DAA+D;QAC/D,uCAAuC;QACvC,wCAAwC;QAExC,wCAAwC;QACxC,IAAI,2BAA2B,GAAG,IAAI,CAAC;QAEvC,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAkB,KAAK,EAAC,OAAO,EAAC,EAAE;YAC7D,MAAM,gBAAgB,GAAG,KAAK,EAAC,KAAK,EAAE,EAAE;gBACpC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBAE/E,kDAAkD;gBAClD,iDAAiD;gBACjD,oCAAoC;gBACpC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;oBACzB,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,GAAG,KAAK,CAAC,GAAG,QAAQ,SAAS,+BAA+B,CAAC,CAAC;oBACtI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,OAAO,KAAK,CAAC;iBAChB;gBAED,IAAI,KAAK,CAAC,GAAG,GAAG,SAAS,EAAE;oBACvB,IAAI,IAAI,CAAC,SAAS,EAAE;wBAChB,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,KAAK,CAAC,GAAG,MAAM,SAAS,yCAAyC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;wBAClK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBACxB,4DAA4D;wBAC5D,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;wBACtD,OAAO,KAAK,CAAC;qBAChB;yBACI;wBACD,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,KAAK,CAAC,GAAG,MAAM,SAAS,wDAAwD,CAAC,CAAC;wBAC3J,4DAA4D;wBAC5D,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;wBACtD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;wBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;wBACf,OAAO,KAAK,CAAC;qBAChB;iBACJ;gBAED,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;oBAC7F,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,+DAA+D,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;oBAC/H,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,OAAO,KAAK,CAAC;iBAChB;gBAED,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,KAAK,CAAC,GAAG,MAAM,SAAS,eAAe,CAAC,CAAC;gBAElH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBAEvB,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC;YAEF,2BAA2B,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC1C,gBAAgB;gBAChB,KAAK,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,MAAM,2BAA2B,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,MAAM,2BAA2B,CAAC;QAElC,OAAO,KAAK,CAAC;IACjB,CAAC;IAGD;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB;QAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpD,OAAO,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpD,OAAO,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACpB,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;SACtE;QACD,IAAI;YACA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE;gBACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;aAC9B;YACD,OAAO,MAAM,CAAC;SACjB;QACD,OAAO,CAAC,EAAE;YACN,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACtC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE;YAClD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;gBACtB,OAAO;aACV;SACJ;IACL,CAAC;IAED,KAAK,CAAC,uCAAuC;QACzC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,EAAE;YACnD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;SAC5B;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAM;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACvC,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,MAAM;aACjB,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAAC,MAAsB,EAAE,EACjD,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,GAGhC;QACG,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,EAAE;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC1C,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,wCAAwC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACpF,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAC7C;QAED,OAAO,EAAE,SAAS,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAW;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjD,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;YAErF,IAAI,UAAU,EAAE;gBACZ,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC3F;iBACI;gBACD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7F;SACJ;IACL,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,EAC1B,aAAa,EACb,gBAAgB,GAOnB;QACG,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE;YACpE,gBAAgB;SACnB,CAAC,CAAC;QAEH,OAAO,EAAE,SAAS,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAClB,gBAAgB,GAMnB;QACG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,aAAa,CAAC,MAAM,CAAC,MAAM,iBAAiB,CAAC,CAAC;YACzF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC;gBACrD,aAAa;gBACb,gBAAgB;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,EAAE;gBACZ,OAAO,EAAE,SAAS,EAAE,CAAC;aACxB;YAED,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;SAC5B;QAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACnB,OAAO;SACV;QACD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/C,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,4BAA4B,CAAC,EAC/B,gBAAgB,GAGnB;QACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEvE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACtC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACjD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC;YACrD,aAAa;YACb,gBAAgB;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE;YACZ,OAAO;SACV;QAED,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAQ;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;SAC3E;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,EACb,gBAAgB,EAChB,KAAK,GAAG,IAAI,MAOZ;QACA,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;KAC/B;QACG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAG,EAAE;YAC1B,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;YAElD,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClB,gBAAgB,GAAG,KAAK,EAAC,KAAK,EAAoB,EAAE;oBAChD,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;oBAClE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACrD,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;oBAEzC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;oBAC3E,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;oBAExD,OAAO,SAAS,CAAC;gBACrB,CAAC,CAAC;aACL;YAED,2EAA2E;YAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,SAAS,EAAE;gBACZ,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;gBACtF,OAAO;aACV;YAED,yEAAyE;YACzE,4DAA4D;YAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;gBACtB,OAAO;aACV;YAED,oBAAoB;YACpB,mCAAmC;YACnC,iFAAiF;YACjF,qBAAqB;YACrB;gBACI,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBACvE,IAAI,CAAC,SAAS,EAAE;oBACZ,OAAO;iBACV;aACJ;YAED,YAAY;YACZ,wEAAwE;YACxE,8GAA8G;YAC9G,IAAI,KAAK,EAAE;gBACP,MAAM,IAAI,CAAC,4BAA4B,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;aACjE;YAED,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1B,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,IAAI,CAAC,UAAU,EAAE;oBACjB,yCAAyC;oBACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;iBAC7B;YACL,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAID,MAAM,yBAAyB,GAAG,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,YAAY,GAKf,EAAE,EAAE;IACD,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,IAAI,YAAY,KAAK,OAAO,EAAE;QAC1B,UAAU,GAAG,UAAU,CAAC;KAC3B;IAED,OAAO,SAAS,CAAC,OAAO,CAAC;QACrB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,YAAY;QAC1B,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;KACpB,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,KAAK,EAAC,EAClC,QAAQ,EACR,aAAa,EACb,YAAY,GAKf,EAAE,EAAE;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IACtC,uEAAuE;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC1B,IAAI,EAAE,QAAQ;QACd,QAAQ;QACR,YAAY,EAAE,YAAY;QAC1B,OAAO;KACV,CAAC,CAAC;IAEH,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;IAC1B,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC"}
@@ -216,7 +216,7 @@ describe('framefusion', () => {
216
216
  const FRAME_SYNC_DELTA = (1 / 30.0) / 2.0;
217
217
  // Act & assert
218
218
  for (let i = 0; i < 10; i++) {
219
- const imagedata = await extractor.getFrameImageDataAtTime(i / 30.0 + FRAME_SYNC_DELTA);
219
+ const imagedata = await extractor.getImageDataAtTime(i / 30.0 + FRAME_SYNC_DELTA);
220
220
  expect(imagedata.width).to.equal(extractor.width);
221
221
  expect(imagedata.height).to.equal(extractor.height);
222
222
  const canvas = createCanvas(imagedata.width, imagedata.height);
@@ -1 +1 @@
1
- {"version":3,"file":"framefusion.test.js","sourceRoot":"","sources":["../../test/framefusion.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"framefusion.test.js","sourceRoot":"","sources":["../../test/framefusion.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumen5/framefusion",
3
- "version": "0.0.4",
3
+ "version": "0.0.11",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "docs": "typedoc framefusion.ts",