@lumen5/framefusion 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/framefusion.cjs +1 -1
- package/dist/framefusion.cjs.map +1 -1
- package/dist/framefusion.es.js +66 -66
- package/dist/framefusion.es.js.map +1 -1
- package/dist/src/backends/beamcoder.js +2 -0
- package/dist/src/backends/beamcoder.js.map +1 -1
- package/dist/test/framefusion.test.js +10 -0
- package/dist/test/framefusion.test.js.map +1 -1
- package/package.json +1 -1
package/dist/framefusion.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var S=(r,i,t)=>{if(!i.has(r))throw TypeError("Cannot "+t)};var e=(r,i,t)=>(S(r,i,"read from private field"),t?t.call(r):i.get(r)),h=(r,i,t)=>{if(i.has(r))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(r):i.set(r,t)},
|
|
1
|
+
"use strict";var S=(r,i,t)=>{if(!i.has(r))throw TypeError("Cannot "+t)};var e=(r,i,t)=>(S(r,i,"read from private field"),t?t.call(r):i.get(r)),h=(r,i,t)=>{if(i.has(r))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(r):i.set(r,t)},a=(r,i,t,s)=>(S(r,i,"write to private field"),s?s.call(r,t):i.set(r,t),t),T=(r,i,t,s)=>({set _(n){a(r,i,n,t)},get _(){return e(r,i,s)}}),$=(r,i,t)=>(S(r,i,"access private method"),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const C=require("@antoinemopa/beamcoder"),I=require("canvas"),L=require("path"),V=require("node:https"),B=require("http"),H=require("tmp"),W=require("fs-extra");class U{static async create(i){throw new Error("Not implemented")}async init({inputFileOrUrl:i,outputFile:t,threadCount:s=8,endTime:n,interpolateFps:c,interpolateMode:l}){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(i){throw new Error("Not implemented")}async getFrameAtTime(i){throw new Error("Not implemented")}async getImageDataAtTime(i){throw new Error("Not implemented")}async getFrameAtPts(i){throw new Error("Not implemented")}async seekToTime(i){throw new Error("Not implemented")}ptsToTime(i){throw new Error("Not implemented")}async readFrames({onFrameAvailable:i,flush:t=!0}={flush:!0,onFrameAvailable:()=>!0}){throw new Error("Not implemented")}async dispose(){throw new Error("Not implemented")}}class G extends Error{}var v,N,k,x;class K{constructor(i){h(this,v,void 0);h(this,N,void 0);h(this,k,void 0);h(this,x,void 0);a(this,v,i)}get filepath(){return e(this,k)}async download(){await new Promise((i,t)=>{const s=e(this,v),n=L.extname(s);a(this,x,H.fileSync({postfix:n}));try{const c=s.startsWith("https://")?V:B;a(this,N,c.get(s,l=>{const u=l.headers["content-type"];if(!u.includes("video")){const f=new Error(`Source ${s}, returned unsupported content type ${u}`);t(f);return}const p=W.createWriteStream(e(this,x).name);l.pipe(p),p.on("finish",()=>{p.close(),a(this,k,e(this,x).name),i()}),p.on("error",f=>{t(f)})})),e(this,N).on("error",l=>{l instanceof G||t(l)})}catch(c){t(c)}})}clear(){e(this,x)&&e(this,x).removeCallback(),e(this,v)&&a(this,v,void 0),e(this,N)&&a(this,N,null),e(this,k)&&a(this,k,void 0)}}v=new WeakMap,N=new WeakMap,k=new WeakMap,x=new WeakMap;const Y=({demuxer:r,streamIndex:i,threadCount:t})=>C.decoder({demuxer:r,width:r.streams[i].codecpar.width,height:r.streams[i].codecpar.height,stream_index:i,pix_fmt:r.streams[i].codecpar.format,thread_count:t}),j=async({stream:r,outputPixelFormat:i,interpolateFps:t,interpolateMode:s="fast"})=>{if(!r.codecpar.format)return null;let n=[`[in0:v]format=${r.codecpar.format}`];if(t)if(s==="high-quality")n=[...n,`minterpolate=fps=${t}`];else if(s==="fast")n=[...n,`fps=${t}`];else throw new Error(`Unexpected interpolation mode: ${s}`);const c=n.join(", ")+"[out0:v]";return C.filterer({filterType:"video",inputParams:[{name:"in0:v",width:r.codecpar.width,height:r.codecpar.height,pixelFormat:r.codecpar.format,timeBase:r.time_base,pixelAspect:r.sample_aspect_ratio}],outputParams:[{name:"out0:v",pixelFormat:i}],filterSpec:c})},M="video",J="rgba";var o,m,b,g,y,_,E,D,d,A,P,z;const q=class extends U{constructor(){super(...arguments);h(this,P);h(this,o,null);h(this,m,null);h(this,b,null);h(this,g,[]);h(this,y,[]);h(this,_,null);h(this,E,null);h(this,D,8);h(this,d,0);h(this,A,0)}static async create(t){const s=new q;return await s.init(t),s}async init({inputFileOrUrl:t,threadCount:s=8}){if(a(this,D,s),t.startsWith("http")){const n=new K(t);await n.download(),t=n.filepath}if(a(this,o,await C.demuxer("file:"+t)),a(this,d,e(this,o).streams.findIndex(n=>n.codecpar.codec_type===M)),e(this,d)===-1)throw new Error(`File has no ${M} stream!`);a(this,b,await j({stream:e(this,o).streams[e(this,d)],outputPixelFormat:J}))}get duration(){const t=e(this,o).streams[e(this,d)].time_base,s=e(this,o).streams.map(n=>n.duration*t[0]/t[1]);return Math.max(...s)}get width(){return e(this,o).streams[e(this,d)].codecpar.width}get height(){return e(this,o).streams[e(this,d)].codecpar.height}async getFrameAtTime(t){const s=Math.floor(this._timeToPTS(t));return this._getFrameAtPts(s)}async getImageDataAtTime(t){const s=Math.floor(this._timeToPTS(t)),n=await this._getFrameAtPts(s);if(!n)return null;const c=this._resizeFrameData(n);return I.createImageData(c,n.width,n.height)}_timeToPTS(t){const s=e(this,o).streams[e(this,d)].time_base;return t*s[1]/s[0]}ptsToTime(t){const s=e(this,o).streams[e(this,d)].time_base;return t*s[0]/s[1]}get packetReadCount(){return e(this,A)}async _getFrameAtPts(t){var p;a(this,A,0);const s=3,n=this.ptsToTime(Math.abs(t-(((p=e(this,_))==null?void 0:p.pts)||0)));(e(this,E)===null||e(this,E)>t||n>s)&&(await e(this,o).seek({stream_index:0,timestamp:t,any:!1}),await $(this,P,z).call(this),a(this,_,null),a(this,y,[]),a(this,E,t),a(this,g,[]));let c=null,l=-1,u=null;if(e(this,g).length>0){const f=e(this,g).flat().find(w=>w.pts<=t);if(f){const w=e(this,g).flat().find(F=>F.pts>f.pts);if(l=f.pts,u=f,w&&w.pts>t||l===t)return a(this,E,t),u}}for(!e(this,_)&&e(this,y).length===0&&({packet:T(this,_)._,frames:T(this,y)._}=await this._getNextPacketAndDecodeFrames(),T(this,A)._++);(e(this,_)||e(this,y).length!==0)&&l<t;){if(e(this,y).length!==0){c=(await e(this,b).filter([{name:"in0:v",frames:e(this,y)}])).flatMap(F=>F.frames);const w=c.reverse().find(F=>F.pts<=t);if(!w)return u;if(e(this,g).unshift(c),e(this,g).length>2&&e(this,g).pop(),l=w==null?void 0:w.pts,!u||l<=t)a(this,E,t),u=w;else break}({packet:T(this,_)._,frames:T(this,y)._}=await this._getNextPacketAndDecodeFrames()),T(this,A)._++}if(!u)throw Error("No matching frame found");return u}async _getNextPacketAndDecodeFrames(){const t=await this._getNextVideoStreamPacket();let s=null;t!==null&&e(this,m)?s=await e(this,m).decode(t):e(this,m)&&(s=await e(this,m).flush(),a(this,m,null));let n=[];return s&&s.frames.length!==0&&(n=s.frames),{packet:t,frames:n}}async _getNextVideoStreamPacket(){let t=await e(this,o).read();for(;t&&t.stream_index!==e(this,d);)if(t=await e(this,o).read(),t===null)return null;return t}_resizeFrameData(t){const n=t.width*t.height*4,c=new Uint8ClampedArray(n),l=t.linesize,u=t.data[0];for(let p=0;p<t.height;p++){const f=p*l,w=f+t.width*4,F=u.slice(f,w),O=p*t.width*4;c.set(F,O)}return c}async dispose(){e(this,m)&&(await e(this,m).flush(),a(this,m,null)),e(this,o).forceClose(),a(this,b,null),a(this,g,void 0),a(this,y,[]),a(this,_,null),a(this,E,null),a(this,d,0)}};let R=q;o=new WeakMap,m=new WeakMap,b=new WeakMap,g=new WeakMap,y=new WeakMap,_=new WeakMap,E=new WeakMap,D=new WeakMap,d=new WeakMap,A=new WeakMap,P=new WeakSet,z=async function(){e(this,m)&&(await e(this,m).flush(),a(this,m,null)),a(this,m,Y({demuxer:e(this,o),streamIndex:e(this,d),threadCount:e(this,D)}))};exports.BeamcoderExtractor=R;
|
|
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 { 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 {\n Packet,\n Demuxer,\n Decoder,\n Filterer,\n Frame\n} from '@antoinemopa/beamcoder';\nimport beamcoder from '@antoinemopa/beamcoder';\nimport type { ImageData } from 'canvas';\nimport { createImageData } from 'canvas';\nimport { BaseExtractor } from '../BaseExtractor';\nimport type { Extractor, ExtractorArgs, InterpolateMode } from '../../framefusion';\nimport { DownloadVideoURL } from '../DownloadVideoURL';\n\nconst VERBOSE = false;\n\nconst createDecoder = ({\n demuxer,\n streamIndex,\n threadCount,\n}: {\n demuxer: Demuxer;\n streamIndex: number;\n threadCount: number;\n}): Decoder => {\n return beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[streamIndex].codecpar.width,\n height: demuxer.streams[streamIndex].codecpar.height,\n stream_index: streamIndex,\n pix_fmt: demuxer.streams[streamIndex].codecpar.format,\n thread_count: threadCount,\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 createFilter = 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 const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n VERBOSE && 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\nconst STREAM_TYPE_VIDEO = 'video';\nconst COLORSPACE_RGBA = 'rgba';\n\n/**\n * A simple extractor that uses beamcoder to extract frames from a video file.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n /**\n * The demuxer reads the file and outputs packet streams\n */\n #demuxer: Demuxer = null;\n\n /**\n * The decoder reads packets and can output raw frame data\n */\n #decoder: Decoder = null;\n\n /**\n * Packets can be filtered to change colorspace, fps and add various effects. If there are no colorspace changes or\n * filters, filter might not be necessary.\n */\n #filterer: Filterer = null;\n\n /**\n * This is where we store filtered frames from each previously processed packet.\n * We keep these in chronological order. We hang on to them for two reasons:\n * 1. so we can return them if we get a request for the same time again\n * 2. so we can return frames close the end of the stream. When such a frame is requested we have to flush (destroy)\n * the encoder to get the last few frames. This avoids having to re-create an encoder.\n */\n #filteredFramesPacket: undefined[] | Array<Array<Frame>> = [];\n\n /**\n * This contains the last raw frames we read from the demuxer. We use it as a starting point for each new query. We\n * do this ensure we don't skip any frames.\n */\n #frames = [];\n\n /**\n * This contains the last packet we read from the demuxer. We use it as a starting point for each new query. We do\n * this ensure we don't skip any frames.\n */\n #packet: null | Packet = null;\n\n /**\n * The last target presentation timestamp (PTS) we requested. If we never requested a time(stamp) then this\n * value is null\n */\n #previousTargetPTS: null | number = null;\n\n /**\n * The number of threads to use for decoding\n */\n #threadCount = 8;\n\n /**\n * The index of the video stream in the demuxer\n */\n #streamIndex = 0;\n\n /**\n * The number of packets we've read from the demuxer to complete the frame query\n * @private\n */\n #packetReadCount = 0;\n\n /**\n * Encoder/Decoder construction is async, so it can't be put in a regular constructor.\n * Use and await this method to generate an extractor.\n */\n static async create(args: ExtractorArgs): Promise<BeamcoderExtractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor;\n }\n\n async init({\n inputFileOrUrl,\n threadCount = 8,\n }: ExtractorArgs): Promise<void> {\n this.#threadCount = threadCount;\n if (inputFileOrUrl.startsWith('http')) {\n VERBOSE && console.log('downloading url', inputFileOrUrl);\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n VERBOSE && console.log('finished downloading');\n }\n this.#demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n this.#streamIndex = this.#demuxer.streams.findIndex(stream => stream.codecpar.codec_type === STREAM_TYPE_VIDEO);\n if (this.#streamIndex === -1) {\n throw new Error(`File has no ${STREAM_TYPE_VIDEO} stream!`);\n }\n this.#filterer = await createFilter({\n stream: this.#demuxer.streams[this.#streamIndex],\n outputPixelFormat: COLORSPACE_RGBA,\n });\n }\n\n async #createDecoder() {\n // It's possible that we need to create decoder multiple times during the lifecycle of this extractor so we\n // need to make sure we destroy the old one first if it exists\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#decoder = createDecoder({\n demuxer: this.#demuxer as Demuxer,\n streamIndex: this.#streamIndex,\n threadCount: this.#threadCount,\n });\n }\n\n /**\n * Duration in seconds\n */\n get duration(): number {\n const time_base = this.#demuxer.streams[this.#streamIndex].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 /**\n * Width in pixels\n */\n get width(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.width;\n }\n\n /**\n * Height in pixels\n */\n get height(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.height;\n }\n\n /**\n * Get the beamcoder Frame for a given time in seconds\n * @param targetTime\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n VERBOSE && console.log(`getFrameAtTime time(s)=${targetTime}`);\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n return this._getFrameAtPts(targetPts);\n }\n\n /**\n * Get imageData for a given time in seconds\n * @param targetTime\n */\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n VERBOSE && console.log('targetTime', targetTime, '-> targetPts', targetPts);\n const frame = await this._getFrameAtPts(targetPts);\n if (!frame) {\n VERBOSE && console.log('no frame found');\n return null;\n }\n const rawData = this._resizeFrameData(frame);\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n ) as ImageData;\n return image;\n }\n\n /**\n * Get the presentation timestamp (PTS) for a given time in seconds\n */\n _timeToPTS(time: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Get the time in seconds from a given presentation timestamp (PTS)\n */\n ptsToTime(pts: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n get packetReadCount() {\n return this.#packetReadCount;\n }\n\n /**\n * Get the frame at the given presentation timestamp (PTS)\n */\n async _getFrameAtPts(targetPTS: number) {\n VERBOSE && console.log('_getFrameAtPts', targetPTS, '-> duration', this.duration);\n this.#packetReadCount = 0;\n\n // seek and create a decoder when retrieving a frame for the first time or when seeking backwards\n // we have to create a new decoder when seeking backwards as the decoder can only process frames in\n // chronological order.\n // RE_SEEK_DELTA: sometimes, we are looking for a frame so far ahead that it's better to drop everything and seek.\n // Example: when we got a frame a 0 and request a frame at t = 30s just after, we don't want to start reading all packets\n // until 30s.\n const RE_SEEK_THRESHOLD = 3; // 3 seconds - typically we have keyframes at shorter intervals\n const timeDifference = this.ptsToTime(Math.abs(targetPTS - (this.#packet?.pts || 0)));\n\n VERBOSE && console.log(`timeDifference: ${timeDifference}, targetPTS: ${targetPTS}, last packet pts: ${this.#packet?.pts}`);\n\n if (this.#previousTargetPTS === null ||\n this.#previousTargetPTS > targetPTS ||\n timeDifference > RE_SEEK_THRESHOLD) {\n VERBOSE && console.log(`Seeking to ${targetPTS}`);\n await this.#demuxer.seek({\n stream_index: 0, // even though we specify the stream index, it still seeks all streams\n timestamp: targetPTS,\n any: false,\n });\n await this.#createDecoder();\n this.#packet = null;\n this.#frames = [];\n this.#previousTargetPTS = targetPTS;\n this.#filteredFramesPacket = [];\n }\n\n let filteredFrames = null;\n let closestFramePTS = -1;\n let outputFrame = null;\n\n // If we have previously filtered frames, get the frame closest to our targetPTS\n if (this.#filteredFramesPacket.length > 0) {\n const closestFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts <= targetPTS) as Frame;\n\n if (closestFrame) {\n const nextFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts > closestFrame.pts) as Frame;\n\n VERBOSE && console.log('returning previously filtered frame with pts', (closestFrame as Frame).pts);\n closestFramePTS = (closestFrame as Frame).pts;\n outputFrame = closestFrame;\n\n if ((nextFrame && nextFrame.pts > targetPTS) || (closestFramePTS === targetPTS)) {\n // We have a next frame, so we know the frame being displayed at targetPTS is the previous one,\n // which corresponds to outputFrame.\n return outputFrame;\n }\n }\n }\n\n // This is the first time we're decoding frames. Get the first packet and decode it.\n if (!this.#packet && this.#frames.length === 0) {\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n this.#packetReadCount++;\n }\n // Read packets until we have a frame which is closest to targetPTS\n while ((this.#packet || this.#frames.length !== 0) && closestFramePTS < targetPTS) {\n VERBOSE && console.log('packet si:', this.#packet?.stream_index, 'pts:', this.#packet?.pts, 'frames:', this.#frames?.length);\n VERBOSE && console.log('frames', this.#frames?.length, 'frames.pts:', this.#frames?.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // packet contains frames\n if (this.#frames.length !== 0) {\n // filter the frames\n const filteredResult = await this.#filterer.filter([{ name: 'in0:v', frames: this.#frames }]);\n filteredFrames = filteredResult.flatMap(r => r.frames);\n VERBOSE && console.log('filteredFrames', filteredFrames.length, 'filteredFrames.pts:', filteredFrames.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // get the closest frame to our target presentation timestamp (PTS)\n // Beamcoder returns decoded packet frames as follows: [1000, 2000, 3000, 4000]\n // If we're looking for a frame at 2500, we want to return the frame at 2000\n const closestFrame = filteredFrames.reverse().find(f => f.pts <= targetPTS);\n\n // The packet contains frames, but all of them have PTS larger than our a targetPTS (we looked too far)\n if (!closestFrame) {\n return outputFrame;\n }\n\n // store the filtered packet frames for later reuse\n this.#filteredFramesPacket.unshift(filteredFrames);\n if (this.#filteredFramesPacket.length > 2) {\n this.#filteredFramesPacket.pop();\n }\n\n closestFramePTS = closestFrame?.pts;\n VERBOSE && console.log('closestFramePTS', closestFramePTS, 'targetPTS', targetPTS);\n if (!outputFrame || closestFramePTS <= targetPTS) {\n VERBOSE && console.log('assigning outputFrame', closestFrame?.pts);\n outputFrame = closestFrame;\n }\n else {\n // break out of the loop if we've found the closest frame (and ensure we don't move to the next\n // packet by calling _getNextPacketAndDecodeFrames again) as this risks us getting a frame that is\n // after our targetPTS\n VERBOSE && console.log('breaking');\n break;\n }\n }\n // get the next packet and frames\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n\n // keep track of how many packets we've read\n this.#packetReadCount++;\n }\n\n if (!outputFrame) {\n throw Error('No matching frame found');\n }\n VERBOSE && console.log('read', this.packetReadCount, 'packets');\n\n return outputFrame;\n }\n\n /**\n * Get the next packet from the video stream and decode it into frames. Each frame has a presentation time stamp\n * (PTS). If we've reached the end of the stream and no more packets are available, we'll extract the last frames\n * from the decoder and destroy it.\n */\n async _getNextPacketAndDecodeFrames() {\n const packet = await this._getNextVideoStreamPacket();\n VERBOSE && console.log('packet pts:', packet?.pts);\n\n // extract frames from the packet\n let decodedFrames = null;\n if (packet !== null && this.#decoder) {\n decodedFrames = await this.#decoder.decode(packet as Packet);\n VERBOSE && console.log('decodedFrames', decodedFrames.frames.length, decodedFrames.frames.map(f => f.pts));\n }\n // we've reached the end of the stream\n else {\n if (this.#decoder) {\n VERBOSE && console.log('getting the last frames from the decoder');\n // flush the decoder -- this will return the last frames and destroy the decoder\n decodedFrames = await this.#decoder.flush();\n this.#decoder = null;\n }\n else {\n // we don't have a decoder, so we can't decode any more frames\n VERBOSE && console.log('no more frames to decode');\n }\n }\n\n let frames = [];\n if (decodedFrames && decodedFrames.frames.length !== 0) {\n frames = decodedFrames.frames;\n }\n\n return { packet, frames };\n }\n\n async _getNextVideoStreamPacket(): Promise<null | Packet> {\n VERBOSE && console.log('_getNextVideoStreamPacket');\n\n let packet = await this.#demuxer.read();\n while (packet && packet.stream_index !== this.#streamIndex) {\n packet = await this.#demuxer.read();\n if (packet === null) {\n VERBOSE && console.log('no more packets');\n return null;\n }\n }\n VERBOSE && console.log('returning packet', !!packet, 'pts', packet?.pts, 'si', packet?.stream_index);\n return packet as Packet;\n }\n\n _resizeFrameData(frame): Uint8ClampedArray {\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); // we should probably reuse this buffer\n const sourceLineSize = frame.linesize as unknown as number;\n // frame.data can contain multiple \"planes\" in other colorspaces, but in rgba, there is just one \"plane\", so\n // our data is in frame.data[0]\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 return rawData;\n }\n\n async dispose() {\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#demuxer.forceClose();\n this.#filterer = null;\n this.#filteredFramesPacket = undefined;\n this.#frames = [];\n this.#packet = null;\n this.#previousTargetPTS = null;\n this.#streamIndex = 0;\n }\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","createDecoder","demuxer","streamIndex","beamcoder","createFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","STREAM_TYPE_VIDEO","COLORSPACE_RGBA","_BeamcoderExtractor","_createDecoder","_demuxer","_decoder","_filterer","_filteredFramesPacket","_frames","_packet","_previousTargetPTS","_threadCount","_streamIndex","_packetReadCount","extractor","downloadUrl","time_base","durations","frame","rawData","createImageData","time","targetPTS","RE_SEEK_THRESHOLD","timeDifference","_a","__privateMethod","createDecoder_fn","filteredFrames","closestFramePTS","outputFrame","closestFrame","f","nextFrame","__privateWrapper","r","packet","decodedFrames","frames","size","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","BeamcoderExtractor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"framefusion.cjs","sources":["../src/BaseExtractor.ts","../src/DownloadVideoURL.ts","../src/backends/beamcoder.ts"],"sourcesContent":["import type { ImageData } from 'canvas';\n\nimport type {\n ExtractorArgs,\n Frame,\n Extractor\n} from '../framefusion';\n\nexport class BaseExtractor implements Extractor {\n static async create(args: ExtractorArgs): Promise<Extractor> {\n throw new Error('Not implemented');\n }\n\n async init({\n inputFileOrUrl,\n outputFile,\n threadCount = 8,\n endTime,\n interpolateFps,\n interpolateMode,\n }: ExtractorArgs): Promise<void> {\n throw new Error('Not implemented');\n }\n\n get duration(): number {\n throw new Error('Not implemented');\n }\n\n get width(): number {\n throw new Error('Not implemented');\n }\n\n get height(): number {\n throw new Error('Not implemented');\n }\n\n async seekToPTS(targetPts: number) {\n throw new Error('Not implemented');\n }\n\n async getFrameAtTime(targetTime: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n throw new Error('Not implemented');\n }\n\n async getFrameAtPts(targetPts: number): Promise<Frame> {\n throw new Error('Not implemented');\n }\n\n async seekToTime(targetTime: number) {\n throw new Error('Not implemented');\n }\n\n /**\n * Convert a PTS (based on timebase) to PTS (in seconds)\n */\n ptsToTime(pts: number) {\n throw new Error('Not implemented');\n }\n\n async readFrames({\n onFrameAvailable,\n flush = true,\n }: {\n /**\n * Return true if we need to read more frames.\n */\n onFrameAvailable?: (frame: Frame) => Promise<boolean> | boolean;\n flush?: boolean;\n } = {\n flush: true,\n onFrameAvailable: () => true,\n }) {\n throw new Error('Not implemented');\n }\n\n async dispose() {\n throw new Error('Not implemented');\n }\n}\n","import path from 'path';\nimport https from 'node:https';\nimport type { ClientRequest } from 'http';\nimport http from 'http';\nimport tmp from 'tmp';\nimport fs from 'fs-extra';\n\nclass CancelRequestError extends Error { }\n\n/**\n * Downloads a video file from a given URL as a temporary file. When the object is cleared, the temporary file is\n * deleted.\n */\nexport class DownloadVideoURL {\n #url: string | undefined;\n #httpRequest: ClientRequest | undefined = undefined;\n #filepath: string | undefined = undefined;\n #tmpObj: tmp.SynchrounousResult | undefined = undefined;\n\n constructor(url) {\n this.#url = url;\n }\n\n /**\n * returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined\n */\n get filepath() {\n return this.#filepath;\n }\n\n /**\n * Downloads the file from the given URL. The file will be downloaded to a temporary file.\n */\n async download() {\n await new Promise<void>((resolve, reject) => {\n const source = this.#url;\n const extension = path.extname(source);\n this.#tmpObj = tmp.fileSync({ postfix: extension });\n try {\n const connectionHandler = source.startsWith('https://') ? https : http;\n this.#httpRequest = connectionHandler.get(source, (res) => {\n const contentType = res.headers['content-type'];\n if (!contentType.includes('video')) {\n const err = new Error(`Source ${source}, returned unsupported content type ${contentType}`);\n reject(err);\n return;\n }\n const writeStream = fs.createWriteStream(this.#tmpObj.name);\n res.pipe(writeStream);\n writeStream.on('finish', () => {\n writeStream.close();\n this.#filepath = this.#tmpObj.name;\n resolve();\n });\n writeStream.on('error', (e) => {\n reject(e);\n });\n });\n this.#httpRequest.on('error', (e) => {\n if (e instanceof CancelRequestError) {\n return;\n }\n reject(e);\n });\n }\n catch (e) {\n reject(e);\n }\n });\n }\n\n clear() {\n if (this.#tmpObj) this.#tmpObj.removeCallback();\n if (this.#url) this.#url = undefined;\n if (this.#httpRequest) this.#httpRequest = null;\n if (this.#filepath) this.#filepath = undefined;\n }\n}\n","import type {\n Packet,\n Demuxer,\n Decoder,\n Filterer,\n Frame\n} from '@antoinemopa/beamcoder';\nimport beamcoder from '@antoinemopa/beamcoder';\nimport type { ImageData } from 'canvas';\nimport { createImageData } from 'canvas';\nimport { BaseExtractor } from '../BaseExtractor';\nimport type { Extractor, ExtractorArgs, InterpolateMode } from '../../framefusion';\nimport { DownloadVideoURL } from '../DownloadVideoURL';\n\nconst VERBOSE = false;\n\nconst createDecoder = ({\n demuxer,\n streamIndex,\n threadCount,\n}: {\n demuxer: Demuxer;\n streamIndex: number;\n threadCount: number;\n}): Decoder => {\n return beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[streamIndex].codecpar.width,\n height: demuxer.streams[streamIndex].codecpar.height,\n stream_index: streamIndex,\n pix_fmt: demuxer.streams[streamIndex].codecpar.format,\n thread_count: threadCount,\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 createFilter = 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 const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n VERBOSE && 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\nconst STREAM_TYPE_VIDEO = 'video';\nconst COLORSPACE_RGBA = 'rgba';\n\n/**\n * A simple extractor that uses beamcoder to extract frames from a video file.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n /**\n * The demuxer reads the file and outputs packet streams\n */\n #demuxer: Demuxer = null;\n\n /**\n * The decoder reads packets and can output raw frame data\n */\n #decoder: Decoder = null;\n\n /**\n * Packets can be filtered to change colorspace, fps and add various effects. If there are no colorspace changes or\n * filters, filter might not be necessary.\n */\n #filterer: Filterer = null;\n\n /**\n * This is where we store filtered frames from each previously processed packet.\n * We keep these in chronological order. We hang on to them for two reasons:\n * 1. so we can return them if we get a request for the same time again\n * 2. so we can return frames close the end of the stream. When such a frame is requested we have to flush (destroy)\n * the encoder to get the last few frames. This avoids having to re-create an encoder.\n */\n #filteredFramesPacket: undefined[] | Array<Array<Frame>> = [];\n\n /**\n * This contains the last raw frames we read from the demuxer. We use it as a starting point for each new query. We\n * do this ensure we don't skip any frames.\n */\n #frames = [];\n\n /**\n * This contains the last packet we read from the demuxer. We use it as a starting point for each new query. We do\n * this ensure we don't skip any frames.\n */\n #packet: null | Packet = null;\n\n /**\n * The last target presentation timestamp (PTS) we requested. If we never requested a time(stamp) then this\n * value is null\n */\n #previousTargetPTS: null | number = null;\n\n /**\n * The number of threads to use for decoding\n */\n #threadCount = 8;\n\n /**\n * The index of the video stream in the demuxer\n */\n #streamIndex = 0;\n\n /**\n * The number of packets we've read from the demuxer to complete the frame query\n * @private\n */\n #packetReadCount = 0;\n\n /**\n * Encoder/Decoder construction is async, so it can't be put in a regular constructor.\n * Use and await this method to generate an extractor.\n */\n static async create(args: ExtractorArgs): Promise<BeamcoderExtractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor;\n }\n\n async init({\n inputFileOrUrl,\n threadCount = 8,\n }: ExtractorArgs): Promise<void> {\n this.#threadCount = threadCount;\n if (inputFileOrUrl.startsWith('http')) {\n VERBOSE && console.log('downloading url', inputFileOrUrl);\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n VERBOSE && console.log('finished downloading');\n }\n this.#demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n this.#streamIndex = this.#demuxer.streams.findIndex(stream => stream.codecpar.codec_type === STREAM_TYPE_VIDEO);\n if (this.#streamIndex === -1) {\n throw new Error(`File has no ${STREAM_TYPE_VIDEO} stream!`);\n }\n this.#filterer = await createFilter({\n stream: this.#demuxer.streams[this.#streamIndex],\n outputPixelFormat: COLORSPACE_RGBA,\n });\n }\n\n async #createDecoder() {\n // It's possible that we need to create decoder multiple times during the lifecycle of this extractor so we\n // need to make sure we destroy the old one first if it exists\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#decoder = createDecoder({\n demuxer: this.#demuxer as Demuxer,\n streamIndex: this.#streamIndex,\n threadCount: this.#threadCount,\n });\n }\n\n /**\n * Duration in seconds\n */\n get duration(): number {\n const time_base = this.#demuxer.streams[this.#streamIndex].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 /**\n * Width in pixels\n */\n get width(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.width;\n }\n\n /**\n * Height in pixels\n */\n get height(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.height;\n }\n\n /**\n * Get the beamcoder Frame for a given time in seconds\n * @param targetTime\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n VERBOSE && console.log(`getFrameAtTime time(s)=${targetTime}`);\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n return this._getFrameAtPts(targetPts);\n }\n\n /**\n * Get imageData for a given time in seconds\n * @param targetTime\n */\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n VERBOSE && console.log('targetTime', targetTime, '-> targetPts', targetPts);\n const frame = await this._getFrameAtPts(targetPts);\n if (!frame) {\n VERBOSE && console.log('no frame found');\n return null;\n }\n const rawData = this._resizeFrameData(frame);\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n ) as ImageData;\n return image;\n }\n\n /**\n * Get the presentation timestamp (PTS) for a given time in seconds\n */\n _timeToPTS(time: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Get the time in seconds from a given presentation timestamp (PTS)\n */\n ptsToTime(pts: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n get packetReadCount() {\n return this.#packetReadCount;\n }\n\n /**\n * Get the frame at the given presentation timestamp (PTS)\n */\n async _getFrameAtPts(targetPTS: number) {\n VERBOSE && console.log('_getFrameAtPts', targetPTS, '-> duration', this.duration);\n this.#packetReadCount = 0;\n\n // seek and create a decoder when retrieving a frame for the first time or when seeking backwards\n // we have to create a new decoder when seeking backwards as the decoder can only process frames in\n // chronological order.\n // RE_SEEK_DELTA: sometimes, we are looking for a frame so far ahead that it's better to drop everything and seek.\n // Example: when we got a frame a 0 and request a frame at t = 30s just after, we don't want to start reading all packets\n // until 30s.\n const RE_SEEK_THRESHOLD = 3; // 3 seconds - typically we have keyframes at shorter intervals\n const timeDifference = this.ptsToTime(Math.abs(targetPTS - (this.#packet?.pts || 0)));\n\n VERBOSE && console.log(`timeDifference: ${timeDifference}, targetPTS: ${targetPTS}, last packet pts: ${this.#packet?.pts}`);\n\n if (this.#previousTargetPTS === null ||\n this.#previousTargetPTS > targetPTS ||\n timeDifference > RE_SEEK_THRESHOLD) {\n VERBOSE && console.log(`Seeking to ${targetPTS}`);\n await this.#demuxer.seek({\n stream_index: 0, // even though we specify the stream index, it still seeks all streams\n timestamp: targetPTS,\n any: false,\n });\n await this.#createDecoder();\n this.#packet = null;\n this.#frames = [];\n this.#previousTargetPTS = targetPTS;\n this.#filteredFramesPacket = [];\n }\n\n let filteredFrames = null;\n let closestFramePTS = -1;\n let outputFrame = null;\n\n // If we have previously filtered frames, get the frame closest to our targetPTS\n if (this.#filteredFramesPacket.length > 0) {\n const closestFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts <= targetPTS) as Frame;\n\n if (closestFrame) {\n const nextFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts > closestFrame.pts) as Frame;\n\n VERBOSE && console.log('returning previously filtered frame with pts', (closestFrame as Frame).pts);\n closestFramePTS = (closestFrame as Frame).pts;\n outputFrame = closestFrame;\n\n if ((nextFrame && nextFrame.pts > targetPTS) || (closestFramePTS === targetPTS)) {\n // We have a next frame, so we know the frame being displayed at targetPTS is the previous one,\n // which corresponds to outputFrame.\n this.#previousTargetPTS = targetPTS;\n return outputFrame;\n }\n }\n }\n\n // This is the first time we're decoding frames. Get the first packet and decode it.\n if (!this.#packet && this.#frames.length === 0) {\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n this.#packetReadCount++;\n }\n // Read packets until we have a frame which is closest to targetPTS\n while ((this.#packet || this.#frames.length !== 0) && closestFramePTS < targetPTS) {\n VERBOSE && console.log('packet si:', this.#packet?.stream_index, 'pts:', this.#packet?.pts, 'frames:', this.#frames?.length);\n VERBOSE && console.log('frames', this.#frames?.length, 'frames.pts:', this.#frames?.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // packet contains frames\n if (this.#frames.length !== 0) {\n // filter the frames\n const filteredResult = await this.#filterer.filter([{ name: 'in0:v', frames: this.#frames }]);\n filteredFrames = filteredResult.flatMap(r => r.frames);\n VERBOSE && console.log('filteredFrames', filteredFrames.length, 'filteredFrames.pts:', filteredFrames.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // get the closest frame to our target presentation timestamp (PTS)\n // Beamcoder returns decoded packet frames as follows: [1000, 2000, 3000, 4000]\n // If we're looking for a frame at 2500, we want to return the frame at 2000\n const closestFrame = filteredFrames.reverse().find(f => f.pts <= targetPTS);\n\n // The packet contains frames, but all of them have PTS larger than our a targetPTS (we looked too far)\n if (!closestFrame) {\n return outputFrame;\n }\n\n // store the filtered packet frames for later reuse\n this.#filteredFramesPacket.unshift(filteredFrames);\n if (this.#filteredFramesPacket.length > 2) {\n this.#filteredFramesPacket.pop();\n }\n\n closestFramePTS = closestFrame?.pts;\n VERBOSE && console.log('closestFramePTS', closestFramePTS, 'targetPTS', targetPTS);\n if (!outputFrame || closestFramePTS <= targetPTS) {\n VERBOSE && console.log('assigning outputFrame', closestFrame?.pts);\n this.#previousTargetPTS = targetPTS;\n outputFrame = closestFrame;\n }\n else {\n // break out of the loop if we've found the closest frame (and ensure we don't move to the next\n // packet by calling _getNextPacketAndDecodeFrames again) as this risks us getting a frame that is\n // after our targetPTS\n VERBOSE && console.log('breaking');\n break;\n }\n }\n // get the next packet and frames\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n\n // keep track of how many packets we've read\n this.#packetReadCount++;\n }\n\n if (!outputFrame) {\n throw Error('No matching frame found');\n }\n VERBOSE && console.log('read', this.packetReadCount, 'packets');\n\n return outputFrame;\n }\n\n /**\n * Get the next packet from the video stream and decode it into frames. Each frame has a presentation time stamp\n * (PTS). If we've reached the end of the stream and no more packets are available, we'll extract the last frames\n * from the decoder and destroy it.\n */\n async _getNextPacketAndDecodeFrames() {\n const packet = await this._getNextVideoStreamPacket();\n VERBOSE && console.log('packet pts:', packet?.pts);\n\n // extract frames from the packet\n let decodedFrames = null;\n if (packet !== null && this.#decoder) {\n decodedFrames = await this.#decoder.decode(packet as Packet);\n VERBOSE && console.log('decodedFrames', decodedFrames.frames.length, decodedFrames.frames.map(f => f.pts));\n }\n // we've reached the end of the stream\n else {\n if (this.#decoder) {\n VERBOSE && console.log('getting the last frames from the decoder');\n // flush the decoder -- this will return the last frames and destroy the decoder\n decodedFrames = await this.#decoder.flush();\n this.#decoder = null;\n }\n else {\n // we don't have a decoder, so we can't decode any more frames\n VERBOSE && console.log('no more frames to decode');\n }\n }\n\n let frames = [];\n if (decodedFrames && decodedFrames.frames.length !== 0) {\n frames = decodedFrames.frames;\n }\n\n return { packet, frames };\n }\n\n async _getNextVideoStreamPacket(): Promise<null | Packet> {\n VERBOSE && console.log('_getNextVideoStreamPacket');\n\n let packet = await this.#demuxer.read();\n while (packet && packet.stream_index !== this.#streamIndex) {\n packet = await this.#demuxer.read();\n if (packet === null) {\n VERBOSE && console.log('no more packets');\n return null;\n }\n }\n VERBOSE && console.log('returning packet', !!packet, 'pts', packet?.pts, 'si', packet?.stream_index);\n return packet as Packet;\n }\n\n _resizeFrameData(frame): Uint8ClampedArray {\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); // we should probably reuse this buffer\n const sourceLineSize = frame.linesize as unknown as number;\n // frame.data can contain multiple \"planes\" in other colorspaces, but in rgba, there is just one \"plane\", so\n // our data is in frame.data[0]\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 return rawData;\n }\n\n async dispose() {\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#demuxer.forceClose();\n this.#filterer = null;\n this.#filteredFramesPacket = undefined;\n this.#frames = [];\n this.#packet = null;\n this.#previousTargetPTS = null;\n this.#streamIndex = 0;\n }\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","createDecoder","demuxer","streamIndex","beamcoder","createFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","STREAM_TYPE_VIDEO","COLORSPACE_RGBA","_BeamcoderExtractor","_createDecoder","_demuxer","_decoder","_filterer","_filteredFramesPacket","_frames","_packet","_previousTargetPTS","_threadCount","_streamIndex","_packetReadCount","extractor","downloadUrl","time_base","durations","frame","rawData","createImageData","time","targetPTS","RE_SEEK_THRESHOLD","timeDifference","_a","__privateMethod","createDecoder_fn","filteredFrames","closestFramePTS","outputFrame","closestFrame","f","nextFrame","__privateWrapper","r","packet","decodedFrames","frames","size","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","BeamcoderExtractor"],"mappings":"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"}
|
package/dist/framefusion.es.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var
|
|
1
|
+
var R = (r, s, t) => {
|
|
2
2
|
if (!s.has(r))
|
|
3
3
|
throw TypeError("Cannot " + t);
|
|
4
4
|
};
|
|
5
|
-
var e = (r, s, t) => (
|
|
5
|
+
var e = (r, s, t) => (R(r, s, "read from private field"), t ? t.call(r) : s.get(r)), h = (r, s, t) => {
|
|
6
6
|
if (s.has(r))
|
|
7
7
|
throw TypeError("Cannot add the same private member more than once");
|
|
8
8
|
s instanceof WeakSet ? s.add(r) : s.set(r, t);
|
|
9
|
-
},
|
|
10
|
-
set _(
|
|
11
|
-
|
|
9
|
+
}, a = (r, s, t, i) => (R(r, s, "write to private field"), i ? i.call(r, t) : s.set(r, t), t), T = (r, s, t, i) => ({
|
|
10
|
+
set _(n) {
|
|
11
|
+
a(r, s, n, t);
|
|
12
12
|
},
|
|
13
13
|
get _() {
|
|
14
14
|
return e(r, s, i);
|
|
15
15
|
}
|
|
16
|
-
}), $ = (r, s, t) => (
|
|
17
|
-
import
|
|
16
|
+
}), $ = (r, s, t) => (R(r, s, "access private method"), t);
|
|
17
|
+
import C from "@antoinemopa/beamcoder";
|
|
18
18
|
import { createImageData as O } from "canvas";
|
|
19
19
|
import V from "path";
|
|
20
20
|
import q from "node:https";
|
|
@@ -29,7 +29,7 @@ class U {
|
|
|
29
29
|
inputFileOrUrl: s,
|
|
30
30
|
outputFile: t,
|
|
31
31
|
threadCount: i = 8,
|
|
32
|
-
endTime:
|
|
32
|
+
endTime: n,
|
|
33
33
|
interpolateFps: c,
|
|
34
34
|
interpolateMode: m
|
|
35
35
|
}) {
|
|
@@ -80,44 +80,44 @@ class U {
|
|
|
80
80
|
}
|
|
81
81
|
class G extends Error {
|
|
82
82
|
}
|
|
83
|
-
var
|
|
83
|
+
var v, N, k, x;
|
|
84
84
|
class K {
|
|
85
85
|
constructor(s) {
|
|
86
|
-
h(this, T, void 0);
|
|
87
86
|
h(this, v, void 0);
|
|
88
87
|
h(this, N, void 0);
|
|
89
|
-
h(this,
|
|
90
|
-
|
|
88
|
+
h(this, k, void 0);
|
|
89
|
+
h(this, x, void 0);
|
|
90
|
+
a(this, v, s);
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
93
93
|
* returns the filepath of the downloaded file. If the file has not been downloaded yet, it will be undefined
|
|
94
94
|
*/
|
|
95
95
|
get filepath() {
|
|
96
|
-
return e(this,
|
|
96
|
+
return e(this, k);
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
99
|
* Downloads the file from the given URL. The file will be downloaded to a temporary file.
|
|
100
100
|
*/
|
|
101
101
|
async download() {
|
|
102
102
|
await new Promise((s, t) => {
|
|
103
|
-
const i = e(this,
|
|
104
|
-
|
|
103
|
+
const i = e(this, v), n = V.extname(i);
|
|
104
|
+
a(this, x, W.fileSync({ postfix: n }));
|
|
105
105
|
try {
|
|
106
106
|
const c = i.startsWith("https://") ? q : H;
|
|
107
|
-
|
|
107
|
+
a(this, N, c.get(i, (m) => {
|
|
108
108
|
const p = m.headers["content-type"];
|
|
109
109
|
if (!p.includes("video")) {
|
|
110
110
|
const u = new Error(`Source ${i}, returned unsupported content type ${p}`);
|
|
111
111
|
t(u);
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
|
-
const f = B.createWriteStream(e(this,
|
|
114
|
+
const f = B.createWriteStream(e(this, x).name);
|
|
115
115
|
m.pipe(f), f.on("finish", () => {
|
|
116
|
-
f.close(),
|
|
116
|
+
f.close(), a(this, k, e(this, x).name), s();
|
|
117
117
|
}), f.on("error", (u) => {
|
|
118
118
|
t(u);
|
|
119
119
|
});
|
|
120
|
-
})), e(this,
|
|
120
|
+
})), e(this, N).on("error", (m) => {
|
|
121
121
|
m instanceof G || t(m);
|
|
122
122
|
});
|
|
123
123
|
} catch (c) {
|
|
@@ -126,15 +126,15 @@ class K {
|
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
128
|
clear() {
|
|
129
|
-
e(this,
|
|
129
|
+
e(this, x) && e(this, x).removeCallback(), e(this, v) && a(this, v, void 0), e(this, N) && a(this, N, null), e(this, k) && a(this, k, void 0);
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
|
-
|
|
132
|
+
v = new WeakMap(), N = new WeakMap(), k = new WeakMap(), x = new WeakMap();
|
|
133
133
|
const Y = ({
|
|
134
134
|
demuxer: r,
|
|
135
135
|
streamIndex: s,
|
|
136
136
|
threadCount: t
|
|
137
|
-
}) =>
|
|
137
|
+
}) => C.decoder({
|
|
138
138
|
demuxer: r,
|
|
139
139
|
width: r.streams[s].codecpar.width,
|
|
140
140
|
height: r.streams[s].codecpar.height,
|
|
@@ -149,16 +149,16 @@ const Y = ({
|
|
|
149
149
|
}) => {
|
|
150
150
|
if (!r.codecpar.format)
|
|
151
151
|
return null;
|
|
152
|
-
let
|
|
152
|
+
let n = [`[in0:v]format=${r.codecpar.format}`];
|
|
153
153
|
if (t)
|
|
154
154
|
if (i === "high-quality")
|
|
155
|
-
|
|
155
|
+
n = [...n, `minterpolate=fps=${t}`];
|
|
156
156
|
else if (i === "fast")
|
|
157
|
-
|
|
157
|
+
n = [...n, `fps=${t}`];
|
|
158
158
|
else
|
|
159
159
|
throw new Error(`Unexpected interpolation mode: ${i}`);
|
|
160
|
-
const c =
|
|
161
|
-
return
|
|
160
|
+
const c = n.join(", ") + "[out0:v]";
|
|
161
|
+
return C.filterer({
|
|
162
162
|
filterType: "video",
|
|
163
163
|
inputParams: [
|
|
164
164
|
{
|
|
@@ -179,11 +179,11 @@ const Y = ({
|
|
|
179
179
|
filterSpec: c
|
|
180
180
|
});
|
|
181
181
|
}, z = "video", Q = "rgba";
|
|
182
|
-
var o, l, D, g, _, y,
|
|
183
|
-
const
|
|
182
|
+
var o, l, D, g, _, y, E, b, d, A, P, I;
|
|
183
|
+
const S = class extends U {
|
|
184
184
|
constructor() {
|
|
185
185
|
super(...arguments);
|
|
186
|
-
h(this,
|
|
186
|
+
h(this, P);
|
|
187
187
|
/**
|
|
188
188
|
* The demuxer reads the file and outputs packet streams
|
|
189
189
|
*/
|
|
@@ -219,11 +219,11 @@ const C = class extends U {
|
|
|
219
219
|
* The last target presentation timestamp (PTS) we requested. If we never requested a time(stamp) then this
|
|
220
220
|
* value is null
|
|
221
221
|
*/
|
|
222
|
-
h(this,
|
|
222
|
+
h(this, E, null);
|
|
223
223
|
/**
|
|
224
224
|
* The number of threads to use for decoding
|
|
225
225
|
*/
|
|
226
|
-
h(this,
|
|
226
|
+
h(this, b, 8);
|
|
227
227
|
/**
|
|
228
228
|
* The index of the video stream in the demuxer
|
|
229
229
|
*/
|
|
@@ -239,20 +239,20 @@ const C = class extends U {
|
|
|
239
239
|
* Use and await this method to generate an extractor.
|
|
240
240
|
*/
|
|
241
241
|
static async create(t) {
|
|
242
|
-
const i = new
|
|
242
|
+
const i = new S();
|
|
243
243
|
return await i.init(t), i;
|
|
244
244
|
}
|
|
245
245
|
async init({
|
|
246
246
|
inputFileOrUrl: t,
|
|
247
247
|
threadCount: i = 8
|
|
248
248
|
}) {
|
|
249
|
-
if (
|
|
250
|
-
const
|
|
251
|
-
await
|
|
249
|
+
if (a(this, b, i), t.startsWith("http")) {
|
|
250
|
+
const n = new K(t);
|
|
251
|
+
await n.download(), t = n.filepath;
|
|
252
252
|
}
|
|
253
|
-
if (
|
|
253
|
+
if (a(this, o, await C.demuxer("file:" + t)), a(this, d, e(this, o).streams.findIndex((n) => n.codecpar.codec_type === z)), e(this, d) === -1)
|
|
254
254
|
throw new Error(`File has no ${z} stream!`);
|
|
255
|
-
|
|
255
|
+
a(this, D, await J({
|
|
256
256
|
stream: e(this, o).streams[e(this, d)],
|
|
257
257
|
outputPixelFormat: Q
|
|
258
258
|
}));
|
|
@@ -262,7 +262,7 @@ const C = class extends U {
|
|
|
262
262
|
*/
|
|
263
263
|
get duration() {
|
|
264
264
|
const t = e(this, o).streams[e(this, d)].time_base, i = e(this, o).streams.map(
|
|
265
|
-
(
|
|
265
|
+
(n) => n.duration * t[0] / t[1]
|
|
266
266
|
);
|
|
267
267
|
return Math.max(...i);
|
|
268
268
|
}
|
|
@@ -291,14 +291,14 @@ const C = class extends U {
|
|
|
291
291
|
* @param targetTime
|
|
292
292
|
*/
|
|
293
293
|
async getImageDataAtTime(t) {
|
|
294
|
-
const i = Math.floor(this._timeToPTS(t)),
|
|
295
|
-
if (!
|
|
294
|
+
const i = Math.floor(this._timeToPTS(t)), n = await this._getFrameAtPts(i);
|
|
295
|
+
if (!n)
|
|
296
296
|
return null;
|
|
297
|
-
const c = this._resizeFrameData(
|
|
297
|
+
const c = this._resizeFrameData(n);
|
|
298
298
|
return O(
|
|
299
299
|
c,
|
|
300
|
-
|
|
301
|
-
|
|
300
|
+
n.width,
|
|
301
|
+
n.height
|
|
302
302
|
);
|
|
303
303
|
}
|
|
304
304
|
/**
|
|
@@ -323,35 +323,35 @@ const C = class extends U {
|
|
|
323
323
|
*/
|
|
324
324
|
async _getFrameAtPts(t) {
|
|
325
325
|
var f;
|
|
326
|
-
|
|
327
|
-
const i = 3,
|
|
328
|
-
(e(this,
|
|
326
|
+
a(this, A, 0);
|
|
327
|
+
const i = 3, n = this.ptsToTime(Math.abs(t - (((f = e(this, y)) == null ? void 0 : f.pts) || 0)));
|
|
328
|
+
(e(this, E) === null || e(this, E) > t || n > i) && (await e(this, o).seek({
|
|
329
329
|
stream_index: 0,
|
|
330
330
|
// even though we specify the stream index, it still seeks all streams
|
|
331
331
|
timestamp: t,
|
|
332
332
|
any: !1
|
|
333
|
-
}), await $(this,
|
|
333
|
+
}), await $(this, P, I).call(this), a(this, y, null), a(this, _, []), a(this, E, t), a(this, g, []));
|
|
334
334
|
let c = null, m = -1, p = null;
|
|
335
335
|
if (e(this, g).length > 0) {
|
|
336
336
|
const u = e(this, g).flat().find((w) => w.pts <= t);
|
|
337
337
|
if (u) {
|
|
338
|
-
const w = e(this, g).flat().find((
|
|
338
|
+
const w = e(this, g).flat().find((F) => F.pts > u.pts);
|
|
339
339
|
if (m = u.pts, p = u, w && w.pts > t || m === t)
|
|
340
|
-
return p;
|
|
340
|
+
return a(this, E, t), p;
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
|
-
for (!e(this, y) && e(this, _).length === 0 && ({ packet:
|
|
343
|
+
for (!e(this, y) && e(this, _).length === 0 && ({ packet: T(this, y)._, frames: T(this, _)._ } = await this._getNextPacketAndDecodeFrames(), T(this, A)._++); (e(this, y) || e(this, _).length !== 0) && m < t; ) {
|
|
344
344
|
if (e(this, _).length !== 0) {
|
|
345
|
-
c = (await e(this, D).filter([{ name: "in0:v", frames: e(this, _) }])).flatMap((
|
|
346
|
-
const w = c.reverse().find((
|
|
345
|
+
c = (await e(this, D).filter([{ name: "in0:v", frames: e(this, _) }])).flatMap((F) => F.frames);
|
|
346
|
+
const w = c.reverse().find((F) => F.pts <= t);
|
|
347
347
|
if (!w)
|
|
348
348
|
return p;
|
|
349
349
|
if (e(this, g).unshift(c), e(this, g).length > 2 && e(this, g).pop(), m = w == null ? void 0 : w.pts, !p || m <= t)
|
|
350
|
-
p = w;
|
|
350
|
+
a(this, E, t), p = w;
|
|
351
351
|
else
|
|
352
352
|
break;
|
|
353
353
|
}
|
|
354
|
-
({ packet:
|
|
354
|
+
({ packet: T(this, y)._, frames: T(this, _)._ } = await this._getNextPacketAndDecodeFrames()), T(this, A)._++;
|
|
355
355
|
}
|
|
356
356
|
if (!p)
|
|
357
357
|
throw Error("No matching frame found");
|
|
@@ -365,9 +365,9 @@ const C = class extends U {
|
|
|
365
365
|
async _getNextPacketAndDecodeFrames() {
|
|
366
366
|
const t = await this._getNextVideoStreamPacket();
|
|
367
367
|
let i = null;
|
|
368
|
-
t !== null && e(this, l) ? i = await e(this, l).decode(t) : e(this, l) && (i = await e(this, l).flush(),
|
|
369
|
-
let
|
|
370
|
-
return i && i.frames.length !== 0 && (
|
|
368
|
+
t !== null && e(this, l) ? i = await e(this, l).decode(t) : e(this, l) && (i = await e(this, l).flush(), a(this, l, null));
|
|
369
|
+
let n = [];
|
|
370
|
+
return i && i.frames.length !== 0 && (n = i.frames), { packet: t, frames: n };
|
|
371
371
|
}
|
|
372
372
|
async _getNextVideoStreamPacket() {
|
|
373
373
|
let t = await e(this, o).read();
|
|
@@ -377,23 +377,23 @@ const C = class extends U {
|
|
|
377
377
|
return t;
|
|
378
378
|
}
|
|
379
379
|
_resizeFrameData(t) {
|
|
380
|
-
const
|
|
380
|
+
const n = t.width * t.height * 4, c = new Uint8ClampedArray(n), m = t.linesize, p = t.data[0];
|
|
381
381
|
for (let f = 0; f < t.height; f++) {
|
|
382
|
-
const u = f * m, w = u + t.width * 4,
|
|
383
|
-
c.set(
|
|
382
|
+
const u = f * m, w = u + t.width * 4, F = p.slice(u, w), L = f * t.width * 4;
|
|
383
|
+
c.set(F, L);
|
|
384
384
|
}
|
|
385
385
|
return c;
|
|
386
386
|
}
|
|
387
387
|
async dispose() {
|
|
388
|
-
e(this, l) && (await e(this, l).flush(),
|
|
388
|
+
e(this, l) && (await e(this, l).flush(), a(this, l, null)), e(this, o).forceClose(), a(this, D, null), a(this, g, void 0), a(this, _, []), a(this, y, null), a(this, E, null), a(this, d, 0);
|
|
389
389
|
}
|
|
390
390
|
};
|
|
391
|
-
let M =
|
|
392
|
-
o = new WeakMap(), l = new WeakMap(), D = new WeakMap(), g = new WeakMap(), _ = new WeakMap(), y = new WeakMap(),
|
|
393
|
-
e(this, l) && (await e(this, l).flush(),
|
|
391
|
+
let M = S;
|
|
392
|
+
o = new WeakMap(), l = new WeakMap(), D = new WeakMap(), g = new WeakMap(), _ = new WeakMap(), y = new WeakMap(), E = new WeakMap(), b = new WeakMap(), d = new WeakMap(), A = new WeakMap(), P = new WeakSet(), I = async function() {
|
|
393
|
+
e(this, l) && (await e(this, l).flush(), a(this, l, null)), a(this, l, Y({
|
|
394
394
|
demuxer: e(this, o),
|
|
395
395
|
streamIndex: e(this, d),
|
|
396
|
-
threadCount: e(this,
|
|
396
|
+
threadCount: e(this, b)
|
|
397
397
|
}));
|
|
398
398
|
};
|
|
399
399
|
export {
|
|
@@ -1 +1 @@
|
|
|
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 {\n Packet,\n Demuxer,\n Decoder,\n Filterer,\n Frame\n} from '@antoinemopa/beamcoder';\nimport beamcoder from '@antoinemopa/beamcoder';\nimport type { ImageData } from 'canvas';\nimport { createImageData } from 'canvas';\nimport { BaseExtractor } from '../BaseExtractor';\nimport type { Extractor, ExtractorArgs, InterpolateMode } from '../../framefusion';\nimport { DownloadVideoURL } from '../DownloadVideoURL';\n\nconst VERBOSE = false;\n\nconst createDecoder = ({\n demuxer,\n streamIndex,\n threadCount,\n}: {\n demuxer: Demuxer;\n streamIndex: number;\n threadCount: number;\n}): Decoder => {\n return beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[streamIndex].codecpar.width,\n height: demuxer.streams[streamIndex].codecpar.height,\n stream_index: streamIndex,\n pix_fmt: demuxer.streams[streamIndex].codecpar.format,\n thread_count: threadCount,\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 createFilter = 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 const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n VERBOSE && 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\nconst STREAM_TYPE_VIDEO = 'video';\nconst COLORSPACE_RGBA = 'rgba';\n\n/**\n * A simple extractor that uses beamcoder to extract frames from a video file.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n /**\n * The demuxer reads the file and outputs packet streams\n */\n #demuxer: Demuxer = null;\n\n /**\n * The decoder reads packets and can output raw frame data\n */\n #decoder: Decoder = null;\n\n /**\n * Packets can be filtered to change colorspace, fps and add various effects. If there are no colorspace changes or\n * filters, filter might not be necessary.\n */\n #filterer: Filterer = null;\n\n /**\n * This is where we store filtered frames from each previously processed packet.\n * We keep these in chronological order. We hang on to them for two reasons:\n * 1. so we can return them if we get a request for the same time again\n * 2. so we can return frames close the end of the stream. When such a frame is requested we have to flush (destroy)\n * the encoder to get the last few frames. This avoids having to re-create an encoder.\n */\n #filteredFramesPacket: undefined[] | Array<Array<Frame>> = [];\n\n /**\n * This contains the last raw frames we read from the demuxer. We use it as a starting point for each new query. We\n * do this ensure we don't skip any frames.\n */\n #frames = [];\n\n /**\n * This contains the last packet we read from the demuxer. We use it as a starting point for each new query. We do\n * this ensure we don't skip any frames.\n */\n #packet: null | Packet = null;\n\n /**\n * The last target presentation timestamp (PTS) we requested. If we never requested a time(stamp) then this\n * value is null\n */\n #previousTargetPTS: null | number = null;\n\n /**\n * The number of threads to use for decoding\n */\n #threadCount = 8;\n\n /**\n * The index of the video stream in the demuxer\n */\n #streamIndex = 0;\n\n /**\n * The number of packets we've read from the demuxer to complete the frame query\n * @private\n */\n #packetReadCount = 0;\n\n /**\n * Encoder/Decoder construction is async, so it can't be put in a regular constructor.\n * Use and await this method to generate an extractor.\n */\n static async create(args: ExtractorArgs): Promise<BeamcoderExtractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor;\n }\n\n async init({\n inputFileOrUrl,\n threadCount = 8,\n }: ExtractorArgs): Promise<void> {\n this.#threadCount = threadCount;\n if (inputFileOrUrl.startsWith('http')) {\n VERBOSE && console.log('downloading url', inputFileOrUrl);\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n VERBOSE && console.log('finished downloading');\n }\n this.#demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n this.#streamIndex = this.#demuxer.streams.findIndex(stream => stream.codecpar.codec_type === STREAM_TYPE_VIDEO);\n if (this.#streamIndex === -1) {\n throw new Error(`File has no ${STREAM_TYPE_VIDEO} stream!`);\n }\n this.#filterer = await createFilter({\n stream: this.#demuxer.streams[this.#streamIndex],\n outputPixelFormat: COLORSPACE_RGBA,\n });\n }\n\n async #createDecoder() {\n // It's possible that we need to create decoder multiple times during the lifecycle of this extractor so we\n // need to make sure we destroy the old one first if it exists\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#decoder = createDecoder({\n demuxer: this.#demuxer as Demuxer,\n streamIndex: this.#streamIndex,\n threadCount: this.#threadCount,\n });\n }\n\n /**\n * Duration in seconds\n */\n get duration(): number {\n const time_base = this.#demuxer.streams[this.#streamIndex].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 /**\n * Width in pixels\n */\n get width(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.width;\n }\n\n /**\n * Height in pixels\n */\n get height(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.height;\n }\n\n /**\n * Get the beamcoder Frame for a given time in seconds\n * @param targetTime\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n VERBOSE && console.log(`getFrameAtTime time(s)=${targetTime}`);\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n return this._getFrameAtPts(targetPts);\n }\n\n /**\n * Get imageData for a given time in seconds\n * @param targetTime\n */\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n VERBOSE && console.log('targetTime', targetTime, '-> targetPts', targetPts);\n const frame = await this._getFrameAtPts(targetPts);\n if (!frame) {\n VERBOSE && console.log('no frame found');\n return null;\n }\n const rawData = this._resizeFrameData(frame);\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n ) as ImageData;\n return image;\n }\n\n /**\n * Get the presentation timestamp (PTS) for a given time in seconds\n */\n _timeToPTS(time: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Get the time in seconds from a given presentation timestamp (PTS)\n */\n ptsToTime(pts: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n get packetReadCount() {\n return this.#packetReadCount;\n }\n\n /**\n * Get the frame at the given presentation timestamp (PTS)\n */\n async _getFrameAtPts(targetPTS: number) {\n VERBOSE && console.log('_getFrameAtPts', targetPTS, '-> duration', this.duration);\n this.#packetReadCount = 0;\n\n // seek and create a decoder when retrieving a frame for the first time or when seeking backwards\n // we have to create a new decoder when seeking backwards as the decoder can only process frames in\n // chronological order.\n // RE_SEEK_DELTA: sometimes, we are looking for a frame so far ahead that it's better to drop everything and seek.\n // Example: when we got a frame a 0 and request a frame at t = 30s just after, we don't want to start reading all packets\n // until 30s.\n const RE_SEEK_THRESHOLD = 3; // 3 seconds - typically we have keyframes at shorter intervals\n const timeDifference = this.ptsToTime(Math.abs(targetPTS - (this.#packet?.pts || 0)));\n\n VERBOSE && console.log(`timeDifference: ${timeDifference}, targetPTS: ${targetPTS}, last packet pts: ${this.#packet?.pts}`);\n\n if (this.#previousTargetPTS === null ||\n this.#previousTargetPTS > targetPTS ||\n timeDifference > RE_SEEK_THRESHOLD) {\n VERBOSE && console.log(`Seeking to ${targetPTS}`);\n await this.#demuxer.seek({\n stream_index: 0, // even though we specify the stream index, it still seeks all streams\n timestamp: targetPTS,\n any: false,\n });\n await this.#createDecoder();\n this.#packet = null;\n this.#frames = [];\n this.#previousTargetPTS = targetPTS;\n this.#filteredFramesPacket = [];\n }\n\n let filteredFrames = null;\n let closestFramePTS = -1;\n let outputFrame = null;\n\n // If we have previously filtered frames, get the frame closest to our targetPTS\n if (this.#filteredFramesPacket.length > 0) {\n const closestFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts <= targetPTS) as Frame;\n\n if (closestFrame) {\n const nextFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts > closestFrame.pts) as Frame;\n\n VERBOSE && console.log('returning previously filtered frame with pts', (closestFrame as Frame).pts);\n closestFramePTS = (closestFrame as Frame).pts;\n outputFrame = closestFrame;\n\n if ((nextFrame && nextFrame.pts > targetPTS) || (closestFramePTS === targetPTS)) {\n // We have a next frame, so we know the frame being displayed at targetPTS is the previous one,\n // which corresponds to outputFrame.\n return outputFrame;\n }\n }\n }\n\n // This is the first time we're decoding frames. Get the first packet and decode it.\n if (!this.#packet && this.#frames.length === 0) {\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n this.#packetReadCount++;\n }\n // Read packets until we have a frame which is closest to targetPTS\n while ((this.#packet || this.#frames.length !== 0) && closestFramePTS < targetPTS) {\n VERBOSE && console.log('packet si:', this.#packet?.stream_index, 'pts:', this.#packet?.pts, 'frames:', this.#frames?.length);\n VERBOSE && console.log('frames', this.#frames?.length, 'frames.pts:', this.#frames?.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // packet contains frames\n if (this.#frames.length !== 0) {\n // filter the frames\n const filteredResult = await this.#filterer.filter([{ name: 'in0:v', frames: this.#frames }]);\n filteredFrames = filteredResult.flatMap(r => r.frames);\n VERBOSE && console.log('filteredFrames', filteredFrames.length, 'filteredFrames.pts:', filteredFrames.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // get the closest frame to our target presentation timestamp (PTS)\n // Beamcoder returns decoded packet frames as follows: [1000, 2000, 3000, 4000]\n // If we're looking for a frame at 2500, we want to return the frame at 2000\n const closestFrame = filteredFrames.reverse().find(f => f.pts <= targetPTS);\n\n // The packet contains frames, but all of them have PTS larger than our a targetPTS (we looked too far)\n if (!closestFrame) {\n return outputFrame;\n }\n\n // store the filtered packet frames for later reuse\n this.#filteredFramesPacket.unshift(filteredFrames);\n if (this.#filteredFramesPacket.length > 2) {\n this.#filteredFramesPacket.pop();\n }\n\n closestFramePTS = closestFrame?.pts;\n VERBOSE && console.log('closestFramePTS', closestFramePTS, 'targetPTS', targetPTS);\n if (!outputFrame || closestFramePTS <= targetPTS) {\n VERBOSE && console.log('assigning outputFrame', closestFrame?.pts);\n outputFrame = closestFrame;\n }\n else {\n // break out of the loop if we've found the closest frame (and ensure we don't move to the next\n // packet by calling _getNextPacketAndDecodeFrames again) as this risks us getting a frame that is\n // after our targetPTS\n VERBOSE && console.log('breaking');\n break;\n }\n }\n // get the next packet and frames\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n\n // keep track of how many packets we've read\n this.#packetReadCount++;\n }\n\n if (!outputFrame) {\n throw Error('No matching frame found');\n }\n VERBOSE && console.log('read', this.packetReadCount, 'packets');\n\n return outputFrame;\n }\n\n /**\n * Get the next packet from the video stream and decode it into frames. Each frame has a presentation time stamp\n * (PTS). If we've reached the end of the stream and no more packets are available, we'll extract the last frames\n * from the decoder and destroy it.\n */\n async _getNextPacketAndDecodeFrames() {\n const packet = await this._getNextVideoStreamPacket();\n VERBOSE && console.log('packet pts:', packet?.pts);\n\n // extract frames from the packet\n let decodedFrames = null;\n if (packet !== null && this.#decoder) {\n decodedFrames = await this.#decoder.decode(packet as Packet);\n VERBOSE && console.log('decodedFrames', decodedFrames.frames.length, decodedFrames.frames.map(f => f.pts));\n }\n // we've reached the end of the stream\n else {\n if (this.#decoder) {\n VERBOSE && console.log('getting the last frames from the decoder');\n // flush the decoder -- this will return the last frames and destroy the decoder\n decodedFrames = await this.#decoder.flush();\n this.#decoder = null;\n }\n else {\n // we don't have a decoder, so we can't decode any more frames\n VERBOSE && console.log('no more frames to decode');\n }\n }\n\n let frames = [];\n if (decodedFrames && decodedFrames.frames.length !== 0) {\n frames = decodedFrames.frames;\n }\n\n return { packet, frames };\n }\n\n async _getNextVideoStreamPacket(): Promise<null | Packet> {\n VERBOSE && console.log('_getNextVideoStreamPacket');\n\n let packet = await this.#demuxer.read();\n while (packet && packet.stream_index !== this.#streamIndex) {\n packet = await this.#demuxer.read();\n if (packet === null) {\n VERBOSE && console.log('no more packets');\n return null;\n }\n }\n VERBOSE && console.log('returning packet', !!packet, 'pts', packet?.pts, 'si', packet?.stream_index);\n return packet as Packet;\n }\n\n _resizeFrameData(frame): Uint8ClampedArray {\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); // we should probably reuse this buffer\n const sourceLineSize = frame.linesize as unknown as number;\n // frame.data can contain multiple \"planes\" in other colorspaces, but in rgba, there is just one \"plane\", so\n // our data is in frame.data[0]\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 return rawData;\n }\n\n async dispose() {\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#demuxer.forceClose();\n this.#filterer = null;\n this.#filteredFramesPacket = undefined;\n this.#frames = [];\n this.#packet = null;\n this.#previousTargetPTS = null;\n this.#streamIndex = 0;\n }\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","createDecoder","demuxer","streamIndex","beamcoder","createFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","STREAM_TYPE_VIDEO","COLORSPACE_RGBA","_BeamcoderExtractor","_createDecoder","_demuxer","_decoder","_filterer","_filteredFramesPacket","_frames","_packet","_previousTargetPTS","_threadCount","_streamIndex","_packetReadCount","extractor","downloadUrl","time_base","durations","frame","rawData","createImageData","time","targetPTS","RE_SEEK_THRESHOLD","timeDifference","_a","__privateMethod","createDecoder_fn","filteredFrames","closestFramePTS","outputFrame","closestFrame","f","nextFrame","__privateWrapper","r","packet","decodedFrames","frames","size","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","BeamcoderExtractor"],"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 {\n Packet,\n Demuxer,\n Decoder,\n Filterer,\n Frame\n} from '@antoinemopa/beamcoder';\nimport beamcoder from '@antoinemopa/beamcoder';\nimport type { ImageData } from 'canvas';\nimport { createImageData } from 'canvas';\nimport { BaseExtractor } from '../BaseExtractor';\nimport type { Extractor, ExtractorArgs, InterpolateMode } from '../../framefusion';\nimport { DownloadVideoURL } from '../DownloadVideoURL';\n\nconst VERBOSE = false;\n\nconst createDecoder = ({\n demuxer,\n streamIndex,\n threadCount,\n}: {\n demuxer: Demuxer;\n streamIndex: number;\n threadCount: number;\n}): Decoder => {\n return beamcoder.decoder({\n demuxer: demuxer,\n width: demuxer.streams[streamIndex].codecpar.width,\n height: demuxer.streams[streamIndex].codecpar.height,\n stream_index: streamIndex,\n pix_fmt: demuxer.streams[streamIndex].codecpar.format,\n thread_count: threadCount,\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 createFilter = 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 const filterSpecStr = filterSpec.join(', ') + '[out0:v]';\n\n VERBOSE && 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\nconst STREAM_TYPE_VIDEO = 'video';\nconst COLORSPACE_RGBA = 'rgba';\n\n/**\n * A simple extractor that uses beamcoder to extract frames from a video file.\n */\nexport class BeamcoderExtractor extends BaseExtractor implements Extractor {\n /**\n * The demuxer reads the file and outputs packet streams\n */\n #demuxer: Demuxer = null;\n\n /**\n * The decoder reads packets and can output raw frame data\n */\n #decoder: Decoder = null;\n\n /**\n * Packets can be filtered to change colorspace, fps and add various effects. If there are no colorspace changes or\n * filters, filter might not be necessary.\n */\n #filterer: Filterer = null;\n\n /**\n * This is where we store filtered frames from each previously processed packet.\n * We keep these in chronological order. We hang on to them for two reasons:\n * 1. so we can return them if we get a request for the same time again\n * 2. so we can return frames close the end of the stream. When such a frame is requested we have to flush (destroy)\n * the encoder to get the last few frames. This avoids having to re-create an encoder.\n */\n #filteredFramesPacket: undefined[] | Array<Array<Frame>> = [];\n\n /**\n * This contains the last raw frames we read from the demuxer. We use it as a starting point for each new query. We\n * do this ensure we don't skip any frames.\n */\n #frames = [];\n\n /**\n * This contains the last packet we read from the demuxer. We use it as a starting point for each new query. We do\n * this ensure we don't skip any frames.\n */\n #packet: null | Packet = null;\n\n /**\n * The last target presentation timestamp (PTS) we requested. If we never requested a time(stamp) then this\n * value is null\n */\n #previousTargetPTS: null | number = null;\n\n /**\n * The number of threads to use for decoding\n */\n #threadCount = 8;\n\n /**\n * The index of the video stream in the demuxer\n */\n #streamIndex = 0;\n\n /**\n * The number of packets we've read from the demuxer to complete the frame query\n * @private\n */\n #packetReadCount = 0;\n\n /**\n * Encoder/Decoder construction is async, so it can't be put in a regular constructor.\n * Use and await this method to generate an extractor.\n */\n static async create(args: ExtractorArgs): Promise<BeamcoderExtractor> {\n const extractor = new BeamcoderExtractor();\n await extractor.init(args);\n return extractor;\n }\n\n async init({\n inputFileOrUrl,\n threadCount = 8,\n }: ExtractorArgs): Promise<void> {\n this.#threadCount = threadCount;\n if (inputFileOrUrl.startsWith('http')) {\n VERBOSE && console.log('downloading url', inputFileOrUrl);\n const downloadUrl = new DownloadVideoURL(inputFileOrUrl);\n await downloadUrl.download();\n inputFileOrUrl = downloadUrl.filepath;\n VERBOSE && console.log('finished downloading');\n }\n this.#demuxer = await beamcoder.demuxer('file:' + inputFileOrUrl);\n this.#streamIndex = this.#demuxer.streams.findIndex(stream => stream.codecpar.codec_type === STREAM_TYPE_VIDEO);\n if (this.#streamIndex === -1) {\n throw new Error(`File has no ${STREAM_TYPE_VIDEO} stream!`);\n }\n this.#filterer = await createFilter({\n stream: this.#demuxer.streams[this.#streamIndex],\n outputPixelFormat: COLORSPACE_RGBA,\n });\n }\n\n async #createDecoder() {\n // It's possible that we need to create decoder multiple times during the lifecycle of this extractor so we\n // need to make sure we destroy the old one first if it exists\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#decoder = createDecoder({\n demuxer: this.#demuxer as Demuxer,\n streamIndex: this.#streamIndex,\n threadCount: this.#threadCount,\n });\n }\n\n /**\n * Duration in seconds\n */\n get duration(): number {\n const time_base = this.#demuxer.streams[this.#streamIndex].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 /**\n * Width in pixels\n */\n get width(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.width;\n }\n\n /**\n * Height in pixels\n */\n get height(): number {\n return this.#demuxer.streams[this.#streamIndex].codecpar.height;\n }\n\n /**\n * Get the beamcoder Frame for a given time in seconds\n * @param targetTime\n */\n async getFrameAtTime(targetTime: number): Promise<beamcoder.Frame> {\n VERBOSE && console.log(`getFrameAtTime time(s)=${targetTime}`);\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n return this._getFrameAtPts(targetPts);\n }\n\n /**\n * Get imageData for a given time in seconds\n * @param targetTime\n */\n async getImageDataAtTime(targetTime: number): Promise<ImageData> {\n const targetPts = Math.floor(this._timeToPTS(targetTime));\n VERBOSE && console.log('targetTime', targetTime, '-> targetPts', targetPts);\n const frame = await this._getFrameAtPts(targetPts);\n if (!frame) {\n VERBOSE && console.log('no frame found');\n return null;\n }\n const rawData = this._resizeFrameData(frame);\n const image = createImageData(\n rawData,\n frame.width,\n frame.height\n ) as ImageData;\n return image;\n }\n\n /**\n * Get the presentation timestamp (PTS) for a given time in seconds\n */\n _timeToPTS(time: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return time * time_base[1] / time_base[0];\n }\n\n /**\n * Get the time in seconds from a given presentation timestamp (PTS)\n */\n ptsToTime(pts: number) {\n const time_base = this.#demuxer.streams[this.#streamIndex].time_base;\n return pts * time_base[0] / time_base[1];\n }\n\n get packetReadCount() {\n return this.#packetReadCount;\n }\n\n /**\n * Get the frame at the given presentation timestamp (PTS)\n */\n async _getFrameAtPts(targetPTS: number) {\n VERBOSE && console.log('_getFrameAtPts', targetPTS, '-> duration', this.duration);\n this.#packetReadCount = 0;\n\n // seek and create a decoder when retrieving a frame for the first time or when seeking backwards\n // we have to create a new decoder when seeking backwards as the decoder can only process frames in\n // chronological order.\n // RE_SEEK_DELTA: sometimes, we are looking for a frame so far ahead that it's better to drop everything and seek.\n // Example: when we got a frame a 0 and request a frame at t = 30s just after, we don't want to start reading all packets\n // until 30s.\n const RE_SEEK_THRESHOLD = 3; // 3 seconds - typically we have keyframes at shorter intervals\n const timeDifference = this.ptsToTime(Math.abs(targetPTS - (this.#packet?.pts || 0)));\n\n VERBOSE && console.log(`timeDifference: ${timeDifference}, targetPTS: ${targetPTS}, last packet pts: ${this.#packet?.pts}`);\n\n if (this.#previousTargetPTS === null ||\n this.#previousTargetPTS > targetPTS ||\n timeDifference > RE_SEEK_THRESHOLD) {\n VERBOSE && console.log(`Seeking to ${targetPTS}`);\n await this.#demuxer.seek({\n stream_index: 0, // even though we specify the stream index, it still seeks all streams\n timestamp: targetPTS,\n any: false,\n });\n await this.#createDecoder();\n this.#packet = null;\n this.#frames = [];\n this.#previousTargetPTS = targetPTS;\n this.#filteredFramesPacket = [];\n }\n\n let filteredFrames = null;\n let closestFramePTS = -1;\n let outputFrame = null;\n\n // If we have previously filtered frames, get the frame closest to our targetPTS\n if (this.#filteredFramesPacket.length > 0) {\n const closestFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts <= targetPTS) as Frame;\n\n if (closestFrame) {\n const nextFrame = this.#filteredFramesPacket\n .flat()\n .find(f => (f as Frame).pts > closestFrame.pts) as Frame;\n\n VERBOSE && console.log('returning previously filtered frame with pts', (closestFrame as Frame).pts);\n closestFramePTS = (closestFrame as Frame).pts;\n outputFrame = closestFrame;\n\n if ((nextFrame && nextFrame.pts > targetPTS) || (closestFramePTS === targetPTS)) {\n // We have a next frame, so we know the frame being displayed at targetPTS is the previous one,\n // which corresponds to outputFrame.\n this.#previousTargetPTS = targetPTS;\n return outputFrame;\n }\n }\n }\n\n // This is the first time we're decoding frames. Get the first packet and decode it.\n if (!this.#packet && this.#frames.length === 0) {\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n this.#packetReadCount++;\n }\n // Read packets until we have a frame which is closest to targetPTS\n while ((this.#packet || this.#frames.length !== 0) && closestFramePTS < targetPTS) {\n VERBOSE && console.log('packet si:', this.#packet?.stream_index, 'pts:', this.#packet?.pts, 'frames:', this.#frames?.length);\n VERBOSE && console.log('frames', this.#frames?.length, 'frames.pts:', this.#frames?.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // packet contains frames\n if (this.#frames.length !== 0) {\n // filter the frames\n const filteredResult = await this.#filterer.filter([{ name: 'in0:v', frames: this.#frames }]);\n filteredFrames = filteredResult.flatMap(r => r.frames);\n VERBOSE && console.log('filteredFrames', filteredFrames.length, 'filteredFrames.pts:', filteredFrames.map(f => f.pts), '-> target.pts:', targetPTS);\n\n // get the closest frame to our target presentation timestamp (PTS)\n // Beamcoder returns decoded packet frames as follows: [1000, 2000, 3000, 4000]\n // If we're looking for a frame at 2500, we want to return the frame at 2000\n const closestFrame = filteredFrames.reverse().find(f => f.pts <= targetPTS);\n\n // The packet contains frames, but all of them have PTS larger than our a targetPTS (we looked too far)\n if (!closestFrame) {\n return outputFrame;\n }\n\n // store the filtered packet frames for later reuse\n this.#filteredFramesPacket.unshift(filteredFrames);\n if (this.#filteredFramesPacket.length > 2) {\n this.#filteredFramesPacket.pop();\n }\n\n closestFramePTS = closestFrame?.pts;\n VERBOSE && console.log('closestFramePTS', closestFramePTS, 'targetPTS', targetPTS);\n if (!outputFrame || closestFramePTS <= targetPTS) {\n VERBOSE && console.log('assigning outputFrame', closestFrame?.pts);\n this.#previousTargetPTS = targetPTS;\n outputFrame = closestFrame;\n }\n else {\n // break out of the loop if we've found the closest frame (and ensure we don't move to the next\n // packet by calling _getNextPacketAndDecodeFrames again) as this risks us getting a frame that is\n // after our targetPTS\n VERBOSE && console.log('breaking');\n break;\n }\n }\n // get the next packet and frames\n ({ packet: this.#packet, frames: this.#frames } = await this._getNextPacketAndDecodeFrames());\n\n // keep track of how many packets we've read\n this.#packetReadCount++;\n }\n\n if (!outputFrame) {\n throw Error('No matching frame found');\n }\n VERBOSE && console.log('read', this.packetReadCount, 'packets');\n\n return outputFrame;\n }\n\n /**\n * Get the next packet from the video stream and decode it into frames. Each frame has a presentation time stamp\n * (PTS). If we've reached the end of the stream and no more packets are available, we'll extract the last frames\n * from the decoder and destroy it.\n */\n async _getNextPacketAndDecodeFrames() {\n const packet = await this._getNextVideoStreamPacket();\n VERBOSE && console.log('packet pts:', packet?.pts);\n\n // extract frames from the packet\n let decodedFrames = null;\n if (packet !== null && this.#decoder) {\n decodedFrames = await this.#decoder.decode(packet as Packet);\n VERBOSE && console.log('decodedFrames', decodedFrames.frames.length, decodedFrames.frames.map(f => f.pts));\n }\n // we've reached the end of the stream\n else {\n if (this.#decoder) {\n VERBOSE && console.log('getting the last frames from the decoder');\n // flush the decoder -- this will return the last frames and destroy the decoder\n decodedFrames = await this.#decoder.flush();\n this.#decoder = null;\n }\n else {\n // we don't have a decoder, so we can't decode any more frames\n VERBOSE && console.log('no more frames to decode');\n }\n }\n\n let frames = [];\n if (decodedFrames && decodedFrames.frames.length !== 0) {\n frames = decodedFrames.frames;\n }\n\n return { packet, frames };\n }\n\n async _getNextVideoStreamPacket(): Promise<null | Packet> {\n VERBOSE && console.log('_getNextVideoStreamPacket');\n\n let packet = await this.#demuxer.read();\n while (packet && packet.stream_index !== this.#streamIndex) {\n packet = await this.#demuxer.read();\n if (packet === null) {\n VERBOSE && console.log('no more packets');\n return null;\n }\n }\n VERBOSE && console.log('returning packet', !!packet, 'pts', packet?.pts, 'si', packet?.stream_index);\n return packet as Packet;\n }\n\n _resizeFrameData(frame): Uint8ClampedArray {\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); // we should probably reuse this buffer\n const sourceLineSize = frame.linesize as unknown as number;\n // frame.data can contain multiple \"planes\" in other colorspaces, but in rgba, there is just one \"plane\", so\n // our data is in frame.data[0]\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 return rawData;\n }\n\n async dispose() {\n if (this.#decoder) {\n await this.#decoder.flush();\n this.#decoder = null;\n }\n this.#demuxer.forceClose();\n this.#filterer = null;\n this.#filteredFramesPacket = undefined;\n this.#frames = [];\n this.#packet = null;\n this.#previousTargetPTS = null;\n this.#streamIndex = 0;\n }\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","createDecoder","demuxer","streamIndex","beamcoder","createFilter","stream","outputPixelFormat","filterSpec","filterSpecStr","STREAM_TYPE_VIDEO","COLORSPACE_RGBA","_BeamcoderExtractor","_createDecoder","_demuxer","_decoder","_filterer","_filteredFramesPacket","_frames","_packet","_previousTargetPTS","_threadCount","_streamIndex","_packetReadCount","extractor","downloadUrl","time_base","durations","frame","rawData","createImageData","time","targetPTS","RE_SEEK_THRESHOLD","timeDifference","_a","__privateMethod","createDecoder_fn","filteredFrames","closestFramePTS","outputFrame","closestFrame","f","nextFrame","__privateWrapper","r","packet","decodedFrames","frames","size","sourceLineSize","pixels","i","sourceStart","sourceEnd","sourceData","targetOffset","BeamcoderExtractor"],"mappings":"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"}
|
|
@@ -262,6 +262,7 @@ export class BeamcoderExtractor extends BaseExtractor {
|
|
|
262
262
|
if ((nextFrame && nextFrame.pts > targetPTS) || (closestFramePTS === targetPTS)) {
|
|
263
263
|
// We have a next frame, so we know the frame being displayed at targetPTS is the previous one,
|
|
264
264
|
// which corresponds to outputFrame.
|
|
265
|
+
this.#previousTargetPTS = targetPTS;
|
|
265
266
|
return outputFrame;
|
|
266
267
|
}
|
|
267
268
|
}
|
|
@@ -298,6 +299,7 @@ export class BeamcoderExtractor extends BaseExtractor {
|
|
|
298
299
|
VERBOSE && console.log('closestFramePTS', closestFramePTS, 'targetPTS', targetPTS);
|
|
299
300
|
if (!outputFrame || closestFramePTS <= targetPTS) {
|
|
300
301
|
VERBOSE && console.log('assigning outputFrame', closestFrame?.pts);
|
|
302
|
+
this.#previousTargetPTS = targetPTS;
|
|
301
303
|
outputFrame = closestFrame;
|
|
302
304
|
}
|
|
303
305
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beamcoder.js","sourceRoot":"","sources":["../../../src/backends/beamcoder.ts"],"names":[],"mappings":"AAOA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,OAAO,GAAG,KAAK,CAAC;AAEtB,MAAM,aAAa,GAAG,CAAC,EACnB,OAAO,EACP,WAAW,EACX,WAAW,GAKd,EAAW,EAAE;IACV,OAAO,SAAS,CAAC,OAAO,CAAC;QACrB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK;QAClD,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM;QACpD,YAAY,EAAE,WAAW;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM;QACrD,YAAY,EAAE,WAAW;KAC5B,CAAC,CAAC;AACP,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAG,KAAK,EAAC,EACvB,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,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;IAEzD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC;IAEvD,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,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACjD;;OAEG;IACH,QAAQ,GAAY,IAAI,CAAC;IAEzB;;OAEG;IACH,QAAQ,GAAY,IAAI,CAAC;IAEzB;;;OAGG;IACH,SAAS,GAAa,IAAI,CAAC;IAE3B;;;;;;OAMG;IACH,qBAAqB,GAAsC,EAAE,CAAC;IAE9D;;;OAGG;IACH,OAAO,GAAG,EAAE,CAAC;IAEb;;;OAGG;IACH,OAAO,GAAkB,IAAI,CAAC;IAE9B;;;OAGG;IACH,kBAAkB,GAAkB,IAAI,CAAC;IAEzC;;OAEG;IACH,YAAY,GAAG,CAAC,CAAC;IAEjB;;OAEG;IACH,YAAY,GAAG,CAAC,CAAC;IAEjB;;;OAGG;IACH,gBAAgB,GAAG,CAAC,CAAC;IAErB;;;OAGG;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,SAAS,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACP,cAAc,EACd,WAAW,GAAG,CAAC,GACH;QACZ,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACnC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;YAC1D,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,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,iBAAiB,CAAC,CAAC;QAChH,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,iBAAiB,UAAU,CAAC,CAAC;SAC/D;QACD,IAAI,CAAC,SAAS,GAAG,MAAM,YAAY,CAAC;YAChC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;YAChD,iBAAiB,EAAE,eAAe;SACrC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,cAAc;QAChB,2GAA2G;QAC3G,8DAA8D;QAC9D,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxB;QACD,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;YAC1B,OAAO,EAAE,IAAI,CAAC,QAAmB;YACjC,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,WAAW,EAAE,IAAI,CAAC,YAAY;SACjC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CACvC,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;;OAEG;IACH,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IACpE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,UAAkB;QACnC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE;YACR,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;SACf;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,eAAe,CACzB,OAAO,EACP,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,CACF,CAAC;QACf,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC;QACrE,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,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC;QACrE,OAAO,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB;QAClC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClF,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAE1B,iGAAiG;QACjG,mGAAmG;QACnG,uBAAuB;QACvB,kHAAkH;QAClH,yHAAyH;QACzH,aAAa;QACb,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,+DAA+D;QAC5F,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtF,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,gBAAgB,SAAS,sBAAsB,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5H,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI;YAChC,IAAI,CAAC,kBAAkB,GAAG,SAAS;YACnC,cAAc,GAAG,iBAAiB,EAAE;YACpC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACrB,YAAY,EAAE,CAAC;gBACf,SAAS,EAAE,SAAS;gBACpB,GAAG,EAAE,KAAK;aACb,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;SACnC;QAED,IAAI,cAAc,GAAG,IAAI,CAAC;QAC1B,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,WAAW,GAAG,IAAI,CAAC;QAEvB,gFAAgF;QAChF,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB;iBAC1C,IAAI,EAAE;iBACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAE,CAAW,CAAC,GAAG,IAAI,SAAS,CAAU,CAAC;YAEvD,IAAI,YAAY,EAAE;gBACd,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB;qBACvC,IAAI,EAAE;qBACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAE,CAAW,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAU,CAAC;gBAE7D,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAG,YAAsB,CAAC,GAAG,CAAC,CAAC;gBACpG,eAAe,GAAI,YAAsB,CAAC,GAAG,CAAC;gBAC9C,WAAW,GAAG,YAAY,CAAC;gBAE3B,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,EAAE;oBAC7E,+FAA+F;oBAC/F,oCAAoC;oBACpC,OAAO,WAAW,CAAC;iBACtB;aACJ;SACJ;QAED,oFAAoF;QACpF,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;YAC9F,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;QACD,mEAAmE;QACnE,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,eAAe,GAAG,SAAS,EAAE;YAC/E,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7H,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;YAElI,yBAAyB;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC3B,oBAAoB;gBACpB,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC9F,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;gBAEpJ,mEAAmE;gBACnE,+EAA+E;gBAC/E,4EAA4E;gBAC5E,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC;gBAE5E,uGAAuG;gBACvG,IAAI,CAAC,YAAY,EAAE;oBACf,OAAO,WAAW,CAAC;iBACtB;gBAED,mDAAmD;gBACnD,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBACnD,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE;oBACvC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC;iBACpC;gBAED,eAAe,GAAG,YAAY,EAAE,GAAG,CAAC;gBACpC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBACnF,IAAI,CAAC,WAAW,IAAI,eAAe,IAAI,SAAS,EAAE;oBAC9C,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;oBACnE,WAAW,GAAG,YAAY,CAAC;iBAC9B;qBACI;oBACD,+FAA+F;oBAC/F,kGAAkG;oBAClG,sBAAsB;oBACtB,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACnC,MAAM;iBACT;aACJ;YACD,iCAAiC;YACjC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;YAE9F,4CAA4C;YAC5C,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;QAED,IAAI,CAAC,WAAW,EAAE;YACd,MAAM,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC1C;QACD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QAEhE,OAAO,WAAW,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,6BAA6B;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACtD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAEnD,iCAAiC;QACjC,IAAI,aAAa,GAAG,IAAI,CAAC;QACzB,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClC,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAgB,CAAC,CAAC;YAC7D,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SAC9G;QACD,sCAAsC;aACjC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACf,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;gBACnE,gFAAgF;gBAChF,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;aACxB;iBACI;gBACD,8DAA8D;gBAC9D,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;aACtD;SACJ;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACpD,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;SACjC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC3B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEpD,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,MAAM,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,EAAE;YACxD,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,MAAM,KAAK,IAAI,EAAE;gBACjB,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC;aACf;SACJ;QACD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACrG,OAAO,MAAgB,CAAC;IAC5B,CAAC;IAED,gBAAgB,CAAC,KAAK;QAClB,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,CAAC,uCAAuC;QACpF,MAAM,cAAc,GAAG,KAAK,CAAC,QAA6B,CAAC;QAC3D,4GAA4G;QAC5G,+BAA+B;QAC/B,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;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACxB;QACD,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1B,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"beamcoder.js","sourceRoot":"","sources":["../../../src/backends/beamcoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -186,6 +186,16 @@ describe('FrameFusion', () => {
|
|
|
186
186
|
// Cleanup
|
|
187
187
|
await extractor.dispose();
|
|
188
188
|
});
|
|
189
|
+
it('can get frames when looping', async () => {
|
|
190
|
+
const extractor = await BeamcoderExtractor.create({
|
|
191
|
+
inputFileOrUrl: 'https://media-share.lumen5.com/proxy-url/?url=https%3A%2F%2Fmedia.tenor.com%2F37odVJNnxHEAAAPo%2Fdominos-dominos-pizza.mp4',
|
|
192
|
+
});
|
|
193
|
+
const times = [0.012667, 1.212667, 1.246, 0.012666];
|
|
194
|
+
for (let i = 0; i < times.length; i++) {
|
|
195
|
+
const frame = await extractor.getFrameAtTime(times[i]);
|
|
196
|
+
expect(Math.floor(extractor.ptsToTime(frame.pts))).to.equal(Math.floor(times[i]));
|
|
197
|
+
}
|
|
198
|
+
});
|
|
189
199
|
it('can get the first 10 frames', async () => {
|
|
190
200
|
// Arrange
|
|
191
201
|
const extractor = await BeamcoderExtractor.create({
|
|
@@ -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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"}
|