@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 +1 -1
- package/dist/framefusion.cjs +1 -1
- package/dist/framefusion.cjs.map +1 -1
- package/dist/framefusion.d.ts +2 -0
- package/dist/framefusion.es.js +19 -16
- package/dist/framefusion.es.js.map +1 -1
- package/dist/framefusion.js +1 -1
- package/dist/framefusion.js.map +1 -1
- package/dist/src/BaseExtractor.d.ts +2 -0
- package/dist/src/BaseExtractor.js +3 -0
- package/dist/src/BaseExtractor.js.map +1 -1
- package/dist/src/backends/beamcoder.d.ts +1 -1
- package/dist/src/backends/beamcoder.js +1 -1
- package/dist/src/backends/beamcoder.js.map +1 -1
- package/dist/test/framefusion.test.js +1 -1
- package/dist/test/framefusion.test.js.map +1 -1
- package/package.json +1 -1
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.
|
|
45
|
+
const imageData = await extractor.getImageDataAtTime(2.0);
|
|
46
46
|
|
|
47
47
|
// Do something with frame data
|
|
48
48
|
console.log(imageData);
|
package/dist/framefusion.cjs
CHANGED
|
@@ -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
|
package/dist/framefusion.cjs.map
CHANGED
|
@@ -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":"uxBAMO,MAAMA,EAAmC,CAC5C,aAAa,OAAOC,EAAyC,CACnD,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,KAAK,CACP,eAAAC,EACA,WAAAC,EACA,YAAAC,EAAc,EACd,QAAAC,EACA,eAAAC,EACA,gBAAAC,CAAA,EAC6B,CACvB,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,IAAI,UAAmB,CACb,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,IAAI,OAAgB,CACV,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,IAAI,QAAiB,CACX,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,UAAUC,EAAmB,CACzB,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,eAAeC,EAAoC,CAC/C,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,cAAcD,EAAmC,CAC7C,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,WAAWC,EAAoB,CAC3B,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAKA,UAAUC,EAAa,CACb,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,WAAW,CACb,iBAAAC,EACA,MAAAC,EAAQ,EAAA,EAOR,CACA,MAAO,GACP,iBAAkB,IAAM,EAAA,EACzB,CACO,MAAA,IAAI,MAAM,iBAAiB,CACrC,CAEA,MAAM,SAAU,CACN,MAAA,IAAI,MAAM,iBAAiB,CACrC,CACJ,CCrEA,MAAMC,WAA2B,KAAM,CAAE,aAMlC,MAAMC,EAAiB,CAM1B,YAAYC,EAAK,CALjBC,EAAA,KAAAC,EAAA,QACAD,EAAA,KAAAE,EAA0C,QAC1CF,EAAA,KAAAG,EAAgC,QAChCH,EAAA,KAAAI,EAA8C,QAG1CC,EAAA,KAAKJ,EAAOF,EAChB,CAKA,IAAI,UAAW,CACX,OAAOO,EAAA,KAAKH,EAChB,CAKA,MAAM,UAAW,CACb,MAAM,IAAI,QAAc,CAACI,EAASC,IAAW,CACzC,MAAMC,EAASH,EAAA,KAAKL,GACdS,EAAYC,GAAK,QAAQF,CAAM,EACrCJ,EAAA,KAAKD,EAAUQ,GAAI,SAAS,CAAE,QAASF,EAAW,GAC9C,GAAA,CACA,MAAMG,EAAoBJ,EAAO,WAAW,UAAU,EAAIK,GAAQC,GAClEV,EAAA,KAAKH,EAAeW,EAAkB,IAAIJ,EAASO,GAAQ,CACjD,MAAAC,EAAcD,EAAI,QAAQ,cAAc,EAC9C,GAAI,CAACC,EAAY,SAAS,OAAO,EAAG,CAChC,MAAMC,EAAM,IAAI,MAAM,UAAUT,wCAA6CQ,GAAa,EAC1FT,EAAOU,CAAG,EACV,OAEJ,MAAMC,EAAcC,GAAG,kBAAkBd,EAAA,KAAKF,GAAQ,IAAI,EAC1DY,EAAI,KAAKG,CAAW,EACRA,EAAA,GAAG,SAAU,IAAM,CAC3BA,EAAY,MAAM,EACbd,EAAA,KAAAF,EAAYG,EAAA,KAAKF,GAAQ,MACtBG,GAAA,CACX,EACWY,EAAA,GAAG,QAAUE,GAAM,CAC3Bb,EAAOa,CAAC,CAAA,CACX,CAAA,CACJ,GACDf,EAAA,KAAKJ,GAAa,GAAG,QAAUmB,GAAM,CAC7BA,aAAaxB,IAGjBW,EAAOa,CAAC,CAAA,CACX,QAEEA,GACHb,EAAOa,CAAC,CACZ,CAAA,CACH,CACL,CAEA,OAAQ,CACAf,EAAA,KAAKF,IAASE,EAAA,KAAKF,GAAQ,iBAC3BE,EAAA,KAAKL,IAAMI,EAAA,KAAKJ,EAAO,QACvBK,EAAA,KAAKJ,IAAcG,EAAA,KAAKH,EAAe,MACvCI,EAAA,KAAKH,IAAWE,EAAA,KAAKF,EAAY,OACzC,CACJ,CA/DIF,EAAA,YACAC,EAAA,YACAC,EAAA,YACAC,EAAA,YCwEJ,MAAMkB,GAAY,MAAM,CACpB,OAAAC,EACA,kBAAAC,EACA,eAAAlC,EACA,gBAAAC,EAAkB,MACtB,IAKmC,CAC3B,GAAA,CAACgC,EAAO,SAAS,OACV,OAAA,KAGX,IAAIE,EAAa,CAAC,iBAAiBF,EAAO,SAAS,QAAQ,EAE3D,GAAIjC,EACA,GAAIC,IAAoB,eACpBkC,EAAa,CAAC,GAAGA,EAAY,oBAAoBnC,GAAgB,UAE5DC,IAAoB,OACzBkC,EAAa,CAAC,GAAGA,EAAY,OAAOnC,GAAgB,MAG9C,OAAA,IAAI,MAAM,kCAAkCC,GAAiB,EAI9DkC,EAAA,CAAC,GAAGA,CAAU,EAE3B,MAAMC,EAAgBD,EAAW,KAAK,IAAI,EAAI,WAEtC,eAAA,IAAI,eAAeC,GAAe,EAEnCC,EAAU,SAAS,CACtB,WAAY,QACZ,YAAa,CACT,CACI,KAAM,QACN,MAAOJ,EAAO,SAAS,MACvB,OAAQA,EAAO,SAAS,OACxB,YAAaA,EAAO,SAAS,OAC7B,SAAUA,EAAO,UACjB,YAAaA,EAAO,mBACxB,CACJ,EACA,aAAc,CACV,CACI,KAAM,SACN,YAAaC,CACjB,CACJ,EACA,WAAYE,CAAA,CACf,CACL,2DAKO,MAAME,EAAN,cAAiC5C,EAAmC,CAApE,kCAoYHgB,EAAA,KAAM6B,GAgBN7B,EAAA,KAAM8B,GAaN9B,EAAA,KAAM+B,GAMN/B,EAAA,KAAMgC,GAYNhC,EAAA,KAAMiC,GAgBNjC,EAAA,KAAMkC,GAcNlC,EAAA,KAAMmC,GAkBNnC,EAAA,KAAMoC,GAmCNpC,EAAA,KAAIqC,GAIJrC,EAAA,KAAMsC,GASNtC,EAAA,KAAMuC,GAlhBNC,EAAA,eAA6B,MAC7BA,EAAA,eAA6B,MAC7BA,EAAA,eAA6B,MAC7BA,EAAA,aAAyB,MACzBA,EAAA,gBAA+B,MAC/BA,EAAA,eACAA,EAAA,gBACAxC,EAAA,KAAAyC,EAAA,QACAzC,EAAA,KAAA0C,EAAa,GACbF,EAAA,sBACAA,EAAA,mBACAA,EAAA,iBAA6B,MAC7BA,EAAA,sBAAoC,CAAA,GACpCxC,EAAA,KAAA2C,EAAiB,IACjB3C,EAAA,KAAA4C,EAAW,IAOX,aAAa,OAAO3D,EAAyC,CACnD,MAAA4D,EAAY,IAAIjB,EAChB,aAAAiB,EAAU,KAAK5D,CAAI,EAClB4D,CACX,CAEA,MAAM,KAAK,CACP,eAAA3D,EACA,WAAAC,EACA,YAAAC,EAAc,EACd,QAAAC,EACA,eAAAC,EACA,gBAAAC,CAAA,EAC6B,CAC7B,GAAI,CAACL,EACK,MAAA,IAAI,MAAM,0BAA0B,EAE1C,IAAA4D,EACAtB,EAAoB,OAEhB,QAAA,IAAI,OAAQ,CAAE,eAAAtC,EAAgB,WAAAC,EAAY,YAAAC,EAAa,QAAAC,EAAS,eAAAC,EAAgB,gBAAAC,EAAiB,kBAAAiC,CAAmB,CAAA,EAQxH,IAAAuB,EAEA,GAAA7D,EAAe,WAAW,MAAM,EAAG,CACnC,QAAQ,IAAI,iBAAiB,EACvB,MAAA8D,EAAc,IAAIlD,GAAiBZ,CAAc,EACvD,MAAM8D,EAAY,WAClB9D,EAAiB8D,EAAY,SAC7B,QAAQ,IAAI,sBAAsB,EAGtC,QAAQ,IAAI,WAAW,EACvB,MAAMC,EAAU,MAAMtB,EAAU,QAAQ,QAAUzC,CAAc,EAGxD,QAAA,IAAI,CAAE,UAAW+D,EAAQ,QAAQ,CAAC,EAAE,UAAW,EAQjD,MAAAC,EAAUvB,EAAU,QAAQ,CAC9B,QAAAsB,EACA,MAAOA,EAAQ,QAAQ,CAAC,EAAE,SAAS,MACnC,OAAQA,EAAQ,QAAQ,CAAC,EAAE,SAAS,OACpC,aAAc,EACd,QAASA,EAAQ,QAAQ,CAAC,EAAE,SAAS,OACrC,aAAc7D,CAAA,CACjB,EAED,IAAI+D,EAAqC,KAEzC,GAAIhE,IACA,CAAC,MAAO,OAAQ,OAAO,EAAE,QAAkBiE,GAAA,CACnCjE,EAAW,SAASiE,CAAM,IACXD,EAAAC,EAGXD,IAAiB,UACG3B,EAAA,YAGpB2B,IAAiB,QACG3B,EAAA,SAE5B,CACH,EAEG,CAAC2B,GACK,MAAA,IAAI,MAAM,uCAAuC,EAWzD,MAAAE,EAAW,MAAM/B,GAAU,CAC7B,OAAQ2B,EAAQ,QAAQ,CAAC,EACzB,kBAAAzB,EACA,eAAAlC,EACA,gBAAAC,CAAA,CACH,EAED,GAAI4D,EAAc,CAOd,MAAMG,EAAUC,GAA0B,CACtC,QAAAL,EACA,aAAAC,EACA,aAAc/D,CAAA,CACjB,EACD,KAAK,QAAUkE,EAST,MAAAE,GAAQ,MAAMC,GAAwB,CACxC,aAAcrE,EACd,SAAUD,EACV,cAAe8D,CAAA,CAClB,EAED,KAAK,MAAQO,GAGjB,KAAK,QAAUN,EACf,KAAK,QAAUD,EACf,KAAK,SAAWI,EAChB,KAAK,QAAUhE,EACf,KAAK,cAAgB0D,EACrB,KAAK,WAAaD,CACtB,CAEA,IAAI,UAAmB,CACnB,MAAMY,EAAY,KAAK,QAAQ,QAAQ,CAAC,EAAE,UACpCC,EAAY,KAAK,QAAQ,QAAQ,OACzBpC,EAAO,SAAWmC,EAAU,CAAC,EAAIA,EAAU,CAAC,CAAA,EAGnD,OAAA,KAAK,IAAI,GAAGC,CAAS,CAChC,CAEA,IAAI,OAAgB,CAChB,OAAO,KAAK,QAAQ,QAAQ,CAAC,EAAE,SAAS,KAC5C,CAEA,IAAI,QAAiB,CACjB,OAAO,KAAK,QAAQ,QAAQ,CAAC,EAAE,SAAS,MAC5C,CAUA,MAAM,UAAUnE,EAAmB,CAC/B,GAAI,EAAAA,IAAc,GAAK,CAAC,KAAK,QAc7B,IAVA,KAAK,UAAY,KACjBa,EAAA,KAAKqC,EAAalD,GACV,QAAA,IAAI,kBAAkBA,GAAW,EACzC,MAAMoE,EAAA,KAAK7B,EAAA8B,GAAL,WACA,MAAA,KAAK,QAAQ,KAAK,CAAE,aAAc,EAAG,UAAWrE,EAAW,EACjE,MAAMoE,EAAA,KAAK7B,EAAA8B,GAAL,WAKC,KAAK,QAAU,KAAK,OAAO,IAAMrE,GAEnC,KAAK,OAAO,MAAgB,CAAE,QAAS,EAAK,EAC7C,MAAMoE,EAAA,KAAK9B,EAAAgC,GAAL,UAEd,CAcA,MAAM,eAAerE,EAA8C,CAE/D,MAAMD,EAAY,KAAK,MAAM,KAAK,UAAUC,CAAU,CAAC,EAChD,OAAA,KAAK,cAAcD,CAAS,CACvC,CAOA,MAAM,wBAAwBC,EAAwC,CAElE,MAAMD,EAAY,KAAK,MAAM,KAAK,UAAUC,CAAU,CAAC,EACjDsE,EAAQ,MAAM,KAAK,cAAcvE,CAAS,EAE1CwE,EAAa,EACbC,EAAOF,EAAM,MAAQA,EAAM,OAASC,EACpCE,EAAU,IAAI,kBAAkBD,CAAI,EACpCE,EAAiBJ,EAAM,SACvBK,EAASL,EAAM,KAAK,CAAC,EAI3B,QAASM,EAAI,EAAGA,EAAIN,EAAM,OAAQM,IAAK,CACnC,MAAMC,EAAcD,EAAIF,EAClBI,EAAYD,EAAcP,EAAM,MAAQC,EACxCQ,EAAaJ,EAAO,MAAME,EAAaC,CAAS,EAChDE,EAAeJ,EAAIN,EAAM,MAAQC,EAC/BE,EAAA,IAAIM,EAAYC,CAAY,EASjC,OANOC,GAAA,gBACVR,EACAH,EAAM,MACNA,EAAM,MAAA,CAId,CAWA,MAAM,cAAcvE,EAA6C,CAG7D,GAAI,KAAK,OAAQ,CACP,MAAAmF,EAAU,KAAK,UAAUnF,CAAS,EAClCoF,EAAc,KAAK,UAAU,KAAK,UAAU,GAAG,EAK/CC,EAAa,EACf,KAAK,IAAIF,EAAUC,CAAW,EAAIC,GAE5B,MAAA,KAAK,UAAUrF,CAAS,EAIlC,GAAA,KAAK,SAAW,MAAQ,KAAK,eAAe,SAAW,GAAKA,GAAa,KAAK,UAAU,IAExF,OAAO,KAAK,UAGZ,GAAA,KAAK,eAAe,OAAS,GAAKA,EAAY,KAAK,eAAe,CAAC,EAAE,IAErE,OAAO,KAAK,UAYhB,IAAIsF,EAA8B,KAElC,MAAMf,EAAQ,MAAM,IAAI,QAAyB,MAAMxD,GAAW,CACxD,MAAAZ,EAAmB,MAAMoE,GAMvBA,EAAM,MAAQvE,GAEd,KAAK,UAAYuE,EACjBxD,EAAQwD,CAAK,EACN,IAGPA,EAAM,IAAMvE,EACR,KAAK,WAELe,EAAQ,KAAK,SAAS,EAEtB,KAAK,eAAiB,CAACwD,EAAO,GAAG,KAAK,cAAc,EAC7C,KAKP,KAAK,eAAiB,CAACA,EAAO,GAAG,KAAK,cAAc,EACpD,KAAK,UAAYA,EACjBxD,EAAQwD,CAAK,EACN,IAIX,KAAK,SAAW,MAAQ,KAAK,eAAe,SAAW,GAAKvE,GAAa,KAAK,UAAU,KAExFe,EAAQwD,CAAK,EACN,KAKX,KAAK,UAAYA,EAEV,IAGXe,EAA8B,KAAK,WAAW,CAC1C,iBAAAnF,EACA,MAAO,EAAA,CACV,EAEK,MAAAmF,CAAA,CACT,EAEK,aAAAA,EAECf,CACX,CAMA,MAAM,WAAWtE,EAAoB,CACjC,MAAM,KAAK,UAAU,KAAK,UAAUA,CAAU,CAAC,CACnD,CAKA,UAAUsF,EAAc,CACpB,MAAMrB,EAAY,KAAK,QAAQ,QAAQ,CAAC,EAAE,UAC1C,OAAOqB,EAAOrB,EAAU,CAAC,EAAIA,EAAU,CAAC,CAC5C,CAKA,UAAUhE,EAAa,CACnB,MAAMgE,EAAY,KAAK,QAAQ,QAAQ,CAAC,EAAE,UAC1C,OAAOhE,EAAMgE,EAAU,CAAC,EAAIA,EAAU,CAAC,CAC3C,CAgLA,MAAM,SAASsB,EAAU,CACrB,GAAI1E,EAAA,KAAKmC,GACC,MAAA,IAAI,MAAM,sDAAsD,EAE1EpC,EAAA,KAAKoC,EAAU,IACf,MAAMuC,EAAS,EACf3E,EAAA,KAAKoC,EAAU,GACnB,CAMA,MAAM,WAAW,CACb,iBAAA9C,EACA,MAAAC,EAAQ,EAAA,EAOR,CACA,MAAO,GACP,iBAAkB,IAAM,EAAA,EACzB,CACO,MAAA,KAAK,SAAS,SAAW,CAC3B,MAAMqF,EAA2BtF,EAiBjC,GAfIW,EAAA,KAAK+B,EAAA6C,KACLvF,EAAmB,MAAMoE,GAA4B,CAEjD,MAAMoB,EAAc,MAAM,KAAK,QAAQ,OAAOpB,CAAK,EAC7C,aAAAH,EAAA,KAAK1B,EAAAkD,GAAL,UAAsBD,GAGV,MAAMF,EAAyBlB,CAAK,CAE/C,GAMX,EADcH,EAAA,KAAK3B,EAAAoD,GAAL,UAA4B,CAAA,EAAI,CAAE,iBAAA1F,KAQhD,KAAK,SAAW,KAQpB,EACU,KAAA,CAAE,UAAA2F,GAAc,MAAM1B,EAAA,KAAKxB,EAAAmD,GAAL,UAAqB,CAAE,iBAAA5F,CAAA,GACnD,GAAI,CAAC2F,EACD,MAER,CAKI1F,GACA,MAAMgE,EAAA,KAAKrB,EAAAiD,IAAL,UAAkC,CAAE,iBAAA7F,CAAkB,GAGV,CACzD,CACL,CAEA,MAAM,SAAU,CACN,MAAA,IAAI,QAASY,GAAY,CAC3B,WAAW,IAAM,CACT,KAAK,aAEA,KAAA,WAAW,OAAO,KAAK,aAAa,EACzC,KAAK,WAAW,YAErB,EAAE,CAAA,CACR,CACL,CACJ,EAvoBO,IAAMkF,EAAN7D,EAQHa,EAAA,YACAC,EAAA,YAKAC,EAAA,YACAC,EAAA,YAqXMf,EAAA,YAAA6D,EAAqB,gBAAA,CACvB,GAAIpF,EAAA,KAAKqC,GACC,MAAA,IAAI,MAAM,iDAAiD,EAEjE,GAAA,CACA,MAAMgD,EAAS,MAAM,KAAK,QAAQ,KAAK,EACvC,OAAKA,GACDtF,EAAA,KAAKsC,EAAiB,IAEnBgD,QAEJ,GACG,MAAA,CACV,CACJ,EAEM7D,EAAA,YAAAgC,EAAc,gBAAA,CACZ,GAAA,KAAK,SAAW,KACV,MAAA,IAAI,MAAM,iBAAiB,EAGrC,IADK,KAAA,OAAS,MAAMF,EAAA,KAAK/B,EAAA6D,GAAL,WACb,KAAK,QAAU,KAAK,OAAO,eAAiB,GAE3C,GADC,KAAA,OAAS,MAAM9B,EAAA,KAAK/B,EAAA6D,GAAL,WAChB,KAAK,SAAW,KAChB,MAGZ,EAEM3D,EAAA,YAAA8B,EAA0C,gBAAA,CAC5C,KAAO,CAAC,KAAK,QAAU,KAAK,OAAO,eAAiB,GAChD,MAAMD,EAAA,KAAK9B,EAAAgC,GAAL,UAEd,EAEM9B,EAAA,YAAA4D,iBAAcC,EAAQ,CACxB,MAAMC,EAAS,MAAM,KAAK,SAAS,OAAO,CAAC,CACvC,KAAM,QACN,OAAAD,CACH,CAAA,CAAC,EACF,YAAK,eAAiBC,EAAO,QAAQ,GAAK,EAAE,MAAM,EAC3C,KAAK,cAChB,EAKM7D,EAAA,YAAAoD,iBAAuBQ,EAAwB,CACjD,iBAAAlG,EAAmB,IAAM,EAAA,EAG1B,CACC,IAAI2F,EAAY,GAEhB,KAAO,KAAK,eAAe,OAAS,GAAKA,GAAW,CAC1C,MAAAvB,EAAQ,KAAK,eAAe,MAAM,EAE5BuB,EAAA,MAAM3F,EAAiBoE,CAAK,EAG5C,MAAO,CAAE,UAAAuB,CAAU,CACvB,EAEMpD,EAAA,YAAAkD,iBAAiBD,EAA4B,CAC/C,QAASY,EAAI,EAAGA,EAAIZ,EAAY,QAAQ,OAAQY,KACzB,CAACzF,EAAA,KAAKoC,IAAcyC,EAAY,QAAQY,CAAC,EAAE,KAAOzF,EAAA,KAAKoC,KAGtE,MAAM,KAAK,MAAM,WAAWyC,EAAY,QAAQY,CAAC,CAAC,CAO9D,EAEM5D,EAAA,YAAA6D,EAAwB,eAAA,CAC1B,cAAAC,EACA,iBAAAtG,CAAA,EAOD,CACC,MAAMuG,EAAiB,MAAMtC,EAAA,KAAK5B,EAAA4D,GAAL,UAAmBK,EAAc,QACxD,CAAE,UAAAX,CAAU,EAAI,MAAM1B,EAAA,KAAK3B,EAAAoD,GAAL,UAA4Ba,EAAgB,CACpE,iBAAAvG,CAAA,GAGJ,MAAO,CAAE,UAAA2F,CAAU,CACvB,EAEMlD,EAAA,YAAAmD,EAAgB,eAAA,CAClB,iBAAA5F,CAAA,EAMiC,CAEjC,IADA,MAAMiE,EAAA,KAAK9B,EAAAgC,GAAL,WACC,KAAK,QAAQ,CAChB,MAAMmC,EAAgB,MAAM,KAAK,QAAQ,OAAO,KAAK,MAAM,EAErD,CAAE,UAAAX,CAAA,EAAc,MAAM1B,EAAA,KAAKzB,EAAA6D,GAAL,UAA6B,CACrD,cAAAC,EACA,iBAAAtG,CAAA,GAGJ,GAAI,CAAC2F,EACD,MAAO,CAAE,UAAAA,CAAU,EAGvB,MAAM1B,EAAA,KAAK9B,EAAAgC,GAAL,WAGH,MAAA,CAAE,UAAW,GACxB,EAUIzB,EAAA,YAAA6C,EAAc,UAAA,CACd,OAAO,KAAK,UAAY,IAC5B,EAEM5C,EAAA,YAAA6D,EAAgB,gBAAA,CACd,GAAA,CAAC7F,EAAA,KAAK+B,EAAA6C,GACN,OAGJ,MAAMC,EAAc,MAAM,KAAK,QAAQ,MAAM,EACvC,MAAAvB,EAAA,KAAK1B,EAAAkD,GAAL,UAAsBD,EAChC,EAEM5C,EAAA,YAAAiD,GAA6B,eAAA,CAC/B,iBAAA7F,CAAA,EAGD,CAGC,GAAIW,EAAA,KAAKsC,GACC,MAAA,IAAI,MAAM,iBAAiB,EAGrCvC,EAAA,KAAKuC,EAAW,IAChB,MAAMqD,EAAgB,MAAM,KAAK,QAAQ,MAAM,EACzC,CAAE,UAAAX,CAAA,EAAc,MAAM1B,EAAA,KAAKzB,EAAA6D,GAAL,UAA6B,CACrD,cAAAC,EACA,iBAAAtG,CAAA,GAGC2F,GAIL,MAAM1B,EAAA,KAAKtB,EAAA6D,GAAL,UACV,EAiGJ,MAAM5C,GAA4B,CAAC,CAC/B,QAAAL,EACA,aAAAC,EACA,aAAAiD,CACJ,IAIM,CACF,IAAIC,EAAa,QACjB,OAAIlD,IAAiB,UACJkD,EAAA,YAGV1E,EAAU,QAAQ,CACrB,KAAMwB,EACN,MAAOD,EAAQ,MACf,OAAQA,EAAQ,OAChB,QAASmD,EACT,aAAAD,EACA,UAAW,CAAC,EAAG,CAAC,CAAA,CACnB,CACL,EAEM3C,GAA0B,MAAM,CAClC,SAAA6C,EACA,cAAAC,EACA,aAAAH,CACJ,IAIM,CACI,MAAAI,EAAW7E,EAAU,WAErB8E,EAAUD,EAAS,OAAO,KAAKA,CAAQ,EAAE,KAAKE,GAAOA,EAAI,QAAQ,KAAK,EAAI,EAAE,CAAC,EAE7ElD,EAAQ7B,EAAU,MAAM,CAC1B,KAAM,SACN,SAAA2E,EACA,aAAAF,EACA,QAAAK,CAAA,CACH,EAED,OAAAjD,EAAM,UAAU+C,EAAc,QAAQ,CAAC,CAAC,EACxC,MAAM/C,EAAM,cACLA,CACX"}
|
|
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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"}
|
package/dist/framefusion.d.ts
CHANGED
|
@@ -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 };
|
package/dist/framefusion.es.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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(),
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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
|
-
},
|
|
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,
|
|
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
|
-
},
|
|
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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"}
|
package/dist/framefusion.js
CHANGED
|
@@ -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.
|
|
24
|
+
// const frame = await extractor.getImageDataAtTime(0.3);
|
|
25
25
|
// console.log(frame);
|
|
26
26
|
// extractor.dispose();
|
|
27
27
|
// };
|
package/dist/framefusion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"framefusion.js","sourceRoot":"","sources":["../framefusion.ts"],"names":[],"mappings":"
|
|
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":"
|
|
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
|
-
|
|
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
|
|
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.
|
|
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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"}
|