{"_id":"turbores","_rev":"9-e6004be32f6309f54a9a4f911bd7a636","name":"turbores","dist-tags":{"latest":"1.2.2"},"versions":{"0.0.1":{"name":"turbores","version":"0.0.1","author":{"name":"Vanilagy"},"license":"ISC","_id":"turbores@0.0.1","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"dist":{"shasum":"9985ec6d75d7bd8045be905b52b30cef95930225","tarball":"https://registry.npmjs.org/turbores/-/turbores-0.0.1.tgz","fileCount":3,"integrity":"sha512-2DbsE9Nnbh+aDK7upgYn2m6FheaW3SSJ7t1VF2+1OK+OFWG5MKl4RJfwz6RviyKsm6LNy3Zn54RSMtov5pax2Q==","signatures":[{"sig":"MEUCIQCo0/maQRwJRpYjIzTgZwan/PzRQYxFbCPv0OIWv395PQIgHpYvte8h6NlP9TeBx64Hbse1hMD9WAwFBkZ9vmz6cZc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":599},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"vanilagy","email":"dpayr@musica-viva.de"},"_npmVersion":"10.9.2","description":"Turbores","directories":{},"_nodeVersion":"22.15.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/turbores_0.0.1_1782664602704_0.7162067927987401","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"turbores","version":"1.0.0","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.0.0","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"4228713e3f798a85095c47099afaafa267d27fbb","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.0.0.tgz","fileCount":5,"integrity":"sha512-pSa+DVX7X7LIZnU86gMEvFMR6ioOy7AjRoZW6/Jx7AEk4EQSC5l6Ki0atQMY2jjut6p37EVAC3mF+Bfew5xtzQ==","signatures":[{"sig":"MEYCIQCgm2VfJo0wPl30YSTGl0Wj+BhyM5mLlBgwtJibaxlwXgIhAJD4LIUR//qExk9hQDsP61Hif7AqgZ90FCHlGMdP2FXS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":241968},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","browser":{"node:os":false,"node:worker_threads":false},"exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"ce3999f539cf008be87f4910efd4f1af8f0caf5d","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.0.0_1782750687714_0.5796939851867775","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"turbores","version":"1.1.0","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.1.0","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"246be376893c14ee639d8f199e8317d89d24f6dd","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.1.0.tgz","fileCount":5,"integrity":"sha512-iVPm4OkpiKXQYosQM8BQceQx1ZHc0F7IRh72Gdc4aY4rPBomgfQOsWqNK62kADukCSz2Cy41MCeiYf9pIhPE2w==","signatures":[{"sig":"MEUCIAXgMUmexKznHn8E2QMP4PKoqDWS7neiDhiuslnoX0AAAiEA8yd/Gz8COf4+D/f9T7BuaTK9yvGqPSMH9CqmZx4n6j4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":241697},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","browser":{"node:os":false,"node:worker_threads":false},"exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"f57109fe63cb54099d27d66919e03456766dba40","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","vite-node":"^6.0.0","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.1.0_1782843956472_0.1975856629672108","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"turbores","version":"1.1.1","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.1.1","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"01b66c1715f8f78bc296f90c987cd915318cf88f","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.1.1.tgz","fileCount":5,"integrity":"sha512-uC2bBqMgMzeE/K4/zeUJd3IwvDm9+0JtNXkiBuc7Sg1L8OaeAhk+VCgoiqDgDdwVaqF3/lztEjrSgt8k15XyYw==","signatures":[{"sig":"MEUCIAeV6EuzwKWrMZF4TlSGmscaX2cte9G4jTjfnRRVEjrcAiEA7nkIXoz4C56P7ppE93PUQ+pyrlxs5ZcV6e099+raG6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":241527},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","browser":{"node:os":false,"node:worker_threads":false},"exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"e8345282d9635d2aced57009c9a1f2ea1059735f","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","vite-node":"^6.0.0","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.1.1_1782849448539_0.6355388020667887","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"turbores","version":"1.1.2","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.1.2","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"a98f5e155d7b86373b6f6b0e6131f9ca0ab16b1b","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.1.2.tgz","fileCount":6,"integrity":"sha512-6k3XH+sG8uOCJEBamKhAXFwIAfLqz7LAQr2mmEx2UBl6zC+4XAGQtp1fGEugnVl2w8Ec5GOUvD+b0tyxUJvmHg==","signatures":[{"sig":"MEQCIBr0+bkuMDeWp9ZUqNNOpGMUCde3zmGW95wdyIG/PYmmAiBCMR3kyM9gl9IWqwdA8WLyVfC6sM/4XGoT3fe+HxdzIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":428607},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"7cad69896e6c963339c0060717af38ccbc4f90f6","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","vite-node":"^6.0.0","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.1.2_1782911206071_0.06656924089840244","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"turbores","version":"1.1.4","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.1.4","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"9994e14d85f682d9290c8507cdbb4438d90e86ea","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.1.4.tgz","fileCount":6,"integrity":"sha512-ZlWVTK+5m0KV0dytbOYozfJlNs5v7W7wWSBRVhbkY9mUjVA9bLHDvPH67bFBjUVTRDlU42dhClI6SZu8YTVs/A==","signatures":[{"sig":"MEUCIB8sOD2o3KBBDfOdG4JYcyfVwS5+ZEzuac3ocOnTReZtAiEAxJvV9Qlib3ieVl3PvQDYNemFcnlwjMwN2e0CYKdUMNQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":428669},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"8bf429ca3cf86091e79477ca650e8b2005cbd552","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","vite-node":"^6.0.0","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.1.4_1782919043962_0.02866221668134261","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"turbores","version":"1.2.0","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.2.0","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"29d1c22525f792cd7a292716a9622da89cc4601d","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.2.0.tgz","fileCount":6,"integrity":"sha512-zhmveMR5/BlrdstVtCtAZE7rHYRbGkttpM1cQvfDQmjVH/MPro+afes+krDDh517wglcZENzRU6DXHZbjt+g3g==","signatures":[{"sig":"MEYCIQC6E9A781476UuDH7q5HQvoETM6XMWJ524/hka0syVNvwIhAPJQNY7Zc5FPxq1dI4u2kmcVa9feIDrNmLq284M/yjSL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":436151},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"36002e626f3bef23957e80cb087193c4a4580eb8","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","vite-node":"^6.0.0","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.2.0_1783015441282_0.39576030582121224","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"turbores","version":"1.2.1","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"author":{"name":"Vanilagy"},"license":"MPL-2.0","_id":"turbores@1.2.1","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"homepage":"https://github.com/Vanilagy/turbores#readme","bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"dist":{"shasum":"cefab8e48cdc70ec37839c6a2fe84caf00b4ba7b","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.2.1.tgz","fileCount":6,"integrity":"sha512-HcnLHiUggT2YXmnTpUdT3JHnkGWvdJlW9XBPLKZBBB3X5oOEuBaHF99cW+H+CSxnhM+rth2qDTCAteIKhKwiGQ==","signatures":[{"sig":"MEYCIQDOrWR52agxjeOKfrA8OGoLKbPE6ASjLi8vk8jPqdzVoQIhAOTteUna64IhEltgt4RAxFtGZrtE6zVM7BA0MkryVizd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":436218},"main":"./dist/turbores.js","type":"module","types":"./dist/turbores.d.ts","module":"./dist/turbores.js","exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"funding":{"url":"https://github.com/sponsors/Vanilagy","type":"individual"},"gitHead":"babe9d17ecbb0feb2c15e5259dcb64e97bb67134","scripts":{"dev":"vite","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"repository":{"url":"git+https://github.com/Vanilagy/turbores.git","type":"git"},"_npmVersion":"11.11.0","description":"An extremely fast Apple ProRes video decoder","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","vite":"^7.2.7","eslint":"^9.22.0","vitest":"^4.1.8","vite-node":"^6.0.0","@eslint/js":"^9.22.0","mediabunny":"^1.25.8","typescript":"^5.9.3","@types/node":"^25.9.2","typescript-eslint":"^8.48.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"_npmOperationalInternal":{"tmp":"tmp/turbores_1.2.1_1783016986820_0.356564261533161","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"turbores","description":"An extremely fast Apple ProRes video decoder","author":{"name":"Vanilagy"},"version":"1.2.2","type":"module","main":"./dist/turbores.js","module":"./dist/turbores.js","types":"./dist/turbores.d.ts","exports":{".":{"types":"./dist/turbores.d.ts","import":"./dist/turbores.js"}},"license":"MPL-2.0","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/Vanilagy/turbores.git"},"bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"funding":{"type":"individual","url":"https://github.com/sponsors/Vanilagy"},"scripts":{"dev":"vite","build":"./scripts/build.sh","check":"tsc --noEmit -p src && tsc -p tests","check-docblocks":"tsx scripts/check-docblocks.ts dist/turbores.d.ts","lint":"zig fmt --check src/index.zig && eslint .","test":"./scripts/build-zig.sh && vitest run","demo:dev":"vite --config demo.vite.config.ts","demo:build":"vite build --config demo.vite.config.ts"},"devDependencies":{"@eslint/js":"^9.22.0","@microsoft/api-extractor":"^7.58.9","@stylistic/eslint-plugin":"^4.2.0","@types/node":"^25.9.2","eslint":"^9.22.0","mediabunny":"^1.25.8","tsx":"^4.22.4","typescript":"^5.9.3","typescript-eslint":"^8.48.0","vite":"^7.2.7","vite-node":"^6.0.0","vitest":"^4.1.8"},"optionalDependencies":{"@rollup/rollup-linux-x64-gnu":"4.62.1"},"keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"gitHead":"a7bba977d9f524dd7663ae04e178f41395ee6063","_id":"turbores@1.2.2","homepage":"https://github.com/Vanilagy/turbores#readme","_nodeVersion":"22.23.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-dTSKeZ6/BgBKz9T5goMS5ZMcqOiNYO1MbvresYGfWXEF5ZWK+yIZDxNjh86bRj1mnEzhtdsMOJ5GBi8b3Azcpg==","shasum":"742f3b0ed5cff8f52804969b05d51a1277e7f794","tarball":"https://registry.npmjs.org/turbores/-/turbores-1.2.2.tgz","fileCount":6,"unpackedSize":436204,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/turbores@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFmUn0bj4hq+uy8MxG74wLlbOVi99Qx7o5vCEjBxXcaYAiBf8m0rXT5x4wxalZTuxUdGnjS2O1wiuvdh8XuOSut0UA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fb4f3868-f7fd-453a-af8a-ca07bb08fd42"}},"directories":{},"maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/turbores_1.2.2_1783631411035_0.973529915381034"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-28T16:36:42.646Z","modified":"2026-07-09T21:10:11.538Z","0.0.1":"2026-06-28T16:36:42.867Z","1.0.0":"2026-06-29T16:31:27.867Z","1.1.0":"2026-06-30T18:25:56.662Z","1.1.1":"2026-06-30T19:57:28.692Z","1.1.2":"2026-07-01T13:06:46.276Z","1.1.4":"2026-07-01T15:17:24.225Z","1.2.0":"2026-07-02T18:04:01.452Z","1.2.1":"2026-07-02T18:29:46.959Z","1.2.2":"2026-07-09T21:10:11.272Z"},"bugs":{"url":"https://github.com/Vanilagy/turbores/issues"},"author":{"name":"Vanilagy"},"license":"MPL-2.0","homepage":"https://github.com/Vanilagy/turbores#readme","keywords":["prores","apple-prores","decoder","decode","decoding","wasm","webassembly","mediabunny","video","codec","browser"],"repository":{"type":"git","url":"git+https://github.com/Vanilagy/turbores.git"},"description":"An extremely fast Apple ProRes video decoder","maintainers":[{"name":"vanilagy","email":"dpayr@musica-viva.de"}],"readme":"# TurboRes\n\n[![](https://img.shields.io/npm/v/turbores)](https://www.npmjs.com/package/turbores)\n[![](https://img.shields.io/bundlephobia/minzip/turbores)](https://bundlephobia.com/package/turbores)\n[![](https://img.shields.io/npm/dm/turbores)](https://www.npmjs.com/package/turbores)\n[![](https://img.shields.io/discord/1390044844285497344?logo=discord&label=Discord)](https://discord.gg/hmpkyYuS4U)\n\nTurboRes is an extremely fast Apple ProRes video decoder library for browsers and other JavaScript environments. It is written from scratch in Zig and TypeScript. Its goal is enabling high-performance processing of ProRes media in browsers without the need for hardware acceleration.\n\n[Interactive demo](https://turbores.pages.dev/)\n\n---\n\nTurboRes is:\n- **Fast.** With both impressive single- and multi-core performance, TurboRes can decode even high-quality 4K videos at hundreds of frames per second and can be [more than twice as fast as native FFmpeg](#performance).\n- **Feature-rich.** TurboRes supports all ProRes variants: 422/444 High Quality, Standard Definition, LT & Proxy, as well as transparent ProRes 4444, with both 10-bit and 12-bit color depths, progressive or interlaced, at all resolutions up to 16K. Additional features include explicit concurrency control and zero-overhead pixel format conversions.\n- **Correct.** TurboRes provides bit-exact decode results and does not approximate.\n- **Robust.** TurboRes fully validates all input and rejects any invalid, corrupted, or malicious data.\n- **Portable.** TurboRes runs everywhere out of the box: Chromium, Firefox, Safari, Node, Deno, Bun.\n- **Simple.** Very minimal API with easy interop with the WebCodecs API and [Mediabunny](https://mediabunny.dev/).\n- **Tiny.** With zero runtime dependencies, the gzipped bundle is only around 50 kB in size.\n\n> This project was fully enabled by generous donations by sponsors. If you've derived value from this package, please consider [leaving a donation](https://github.com/sponsors/Vanilagy)! 💘\n\n## Motivation\n\nAs the author of [Mediabunny](https://mediabunny.dev/), I regularly get requests for adding ProRes support to the library. I initially tried doing this by using ffmpeg.wasm, but the performance was insufficient for real-time applications. Knowing that FFmpeg wasn't originally built with WASM in mind, I suspected that a custom-built solution would probably beat it. So, my goals for this library were twofold:\n\n- Learn how video decoders work and build one from scratch, ideally with minimal AI assistance\n- Build a relentlessly-optimized ProRes decoder capable of faster-than-real-time video decoding in browsers\n\nIt started mainly as a hobby experiment and learning exercise, but since the performance ended up being extremely competitive, I ultimately turned it into a polished library.\n\n## Installation\n\nDownload and install TurboRes from the npm registry:\n```bash\nnpm install turbores\n```\n\n---\n\nAlternatively, download the ESM build `turbores.js` (and `turbores.d.ts` for types) from the [releases page](https://github.com/Vanilagy/turbores/releases) and then import it directly:\n```ts\nimport { /* ... */ } from './turbores.js';\n```\n\n---\n\nYou can also download `turbores.umd.cjs` from the [releases page](https://github.com/Vanilagy/turbores/releases) and import it using a plain script tag:\n```html\n<script src=\"./turbores.umd.cjs\"></script>\n```\nThis will expose a global `TurboRes` namespace. Types for this global are also provided by `turbores.d.ts`.\n\n## Usage\n\n```ts\nimport { Decoder, Frame } from 'turbores';\n\n// Create a decoder for each stream you want to decode\nconst decoder = await Decoder.create({\n    // The FourCC identifying the ProRes variant, usually found as metadata\n    // within the file that contains the ProRes media. When not available,\n    // 'apch' is a good default.\n    proresFourCc: 'apch',\n\n    // Whether to use shared-memory multithreading. Recommended for best\n    // performance, but requires cross-origin isolation.\n    useSharedMemory: true,\n});\nif (decoder instanceof Error) {\n    // Handle the error...\n}\n\n// Create a frame to hold the output data\nconst frame = new Frame();\n\nconst result = await decoder.decode(\n    packetData, // Uint8Array containing a single ProRes frame\n    frame,\n);\nif (result instanceof Error) {\n    // Handle the error...\n}\n```\n\nYou can extract the encoded packets from a media file using a library like [Mediabunny](https://mediabunny.dev/).\n\n`result` is now the decoded frame of type `FilledFrame`. An HDR 1080p frame might look like:\n```ts\nresult.frameData; // => Uint8Array\nresult.pixelFormat; // => 'I422P10'\nresult.scanType; // => 'progressive'\n\nresult.codedWidth; // => 1920\nresult.codedHeight; // => 1088\nresult.visibleWidth; // => 1920\nresult.visibleHeight; // => 1080\nresult.pixelAspectRatio; // => { num: 1, den: 1 }\n\nresult.colorPrimaries; // => 9 (ITU-R BT.2020)\nresult.colorTransfer; // => 18 (ITU-R BT.2100-2 (HLG))\nresult.colorMatrix; // => 9 (ITU-R BT.2020)\nresult.colorRangeFull; // => false\n```\n\nThe frame's data is valid until it is used for a new decoding task. If you need to keep multiple frames around at the same time, create multiple `Frame` instances.\n\nWhen done, you **should** close all frames and decoders to free internally-held resources:\n```ts\nframe.clear();\ndecoder.close();\n```\n\n### Errors\n\nTurboRes uses _errors as values_, meaning functions return either the result or an error. The following errors may occur during operation:\n- `OutOfMemoryError`: The decoder ran out of memory.\n- `UnexpectedEofError`: The packet ended before the decoder expected it to.\n- `InvalidDataError`: The packet contains invalid or corrupted data.\n- `NotSupportedError`: The packet uses a feature that the decoder doesn't support.\n- `InvalidStateError`: The decoder is in an invalid internal state. This should never happen and should be reported.\n- `DecoderClosedError`: An operation was attempted on a decoder that has already been closed.\n- `FrameLockedError`: A frame was used while it is locked by an in-flight decoding operation.\n\nSince errors are returned plainly, you can check for them using a simple `instanceof` check.\n\n### Multithreading\n\nTurboRes can use multiple threads to run faster. It has two systems for doing this:\n- **Shared-memory multithreading:** Here, all threads operate on the same memory and can split up the work of decoding a single ProRes packet. This is the fastest option with the least overhead, and provides extremely low latency since multiple threads attack the same packet.\n- **Worker pool-based multithreading:** Here, multiple workers are created, each of which decodes a packet fully by itself. When multiple packets are decoded in quick succession, the packets are distributed to multiple workers so they can decode frames in parallel. This variant has higher decoding latency and overhead due to message passing.\n\n---\n\nEnable shared-memory multithreading like so:\n```ts\nconst decoder = await Decoder.create({\n    useSharedMemory: true,\n    // ...\n});\n```\nWhen run in a browser, this requires the page to be [cross-origin isolated](https://developer.mozilla.org/en-US/docs/Web/API/Window/crossOriginIsolated). This can be done by setting the following HTTP response headers:\n```\nCross-Origin-Opener-Policy: same-origin\nCross-Origin-Embedder-Policy: require-corp\n```\n\nAlternatively, you can use:\n```\nCross-Origin-Opener-Policy: same-origin\nCross-Origin-Embedder-Policy: credentialless\n```\nwhich is generally more permissive but is not supported in Safari (of course).\n\n---\n\nControl the number of threads via the `concurrency` option:\n```ts\nconst decoder = await Decoder.create({\n    useSharedMemory: true,\n    concurrency: 8, // Use 8 threads. Defaults to `navigator.hardwareConcurrency`. \n});\n```\n\nTo force synchronous decoding, set `concurrency` to zero:\n```ts\nconst decoder = await Decoder.create({\n    useSharedMemory: true, // or false, doesn't matter\n    concurrency: 0,\n});\n```\n\nMessage passing is never required for synchronous decoding, but it will block the main thread.\n\n### Pixel format conversions\n\nTurboRes is able to perform pixel format conversions at _no additional cost_. This is useful for when your consuming code cannot support the pixel formats typically emitted by ProRes, such as `I422P10`.\n\nTo convert to a desired pixel format, use:\n```ts\nconst decoder = await Decoder.create({\n    // This FORCES the decoder to output all frames in I420:\n    allowedOutputFormats: ['I420'],\n});\n```\n\nYou can always inspect the original pixel format stored in the packet via `frame.originalPixelFormat`.\n\nYou can specify multiple format options:\n```ts\nconst decoder = await Decoder.create({\n    allowedOutputFormats: ['I420', 'I420A', 'I422P10', 'I422AP10'],\n});\n```\n\nWhen the native pixel format is allowed, the decoder will choose that. Otherwise, it will choose an alternative format that minimizes data loss according to an internal heuristic.\n\nThese pixel formats are supported by TurboRes: \\\n`I420`, `I420P10`, `I420P12`, `I420A`, `I420AP10`, `I420AP12` \\\n`I422`, `I422P10`, `I422P12`, `I422A`, `I422AP10`, `I422AP12` \\\n`I444`, `I444P10`, `I444P12`, `I444A`, `I444AP10`, `I444AP12`\n\n### Packet queueing\n\nMultiple packets can be queued for decoding for improved decoding performance:\n```ts\nconst frame1 = new Frame();\nconst frame2 = new Frame();\nconst frame3 = new Frame();\n\nconst promise1 = decoder.decode(packetData1, frame1);\nconst promise2 = decoder.decode(packetData2, frame2);\nconst promise3 = decoder.decode(packetData3, frame3);\n\n// You can use these to inspect the decoder's decode queue:\ndecoder.decodeQueueSize; // => 3\nawait decoder.dequeued;\ndecoder.decodeQueueSize; // => 2\nawait decoder.dequeued;\ndecoder.decodeQueueSize; // => 1\nawait decoder.dequeued;\ndecoder.decodeQueueSize; // => 0\n```\n\nDecoding jobs will always resolve in the order in which they were queued, meaning `promise1` will resolve before `promise2`, which will resolve before `promise3`.\n\nYou can read `decoder.desiredSize` to get a watermark signal for pushing packets to the decoder. When zero or below, the decoder is maximally strained and you should await `decoder.dequeued` before continuing.\n\n## Performance\n\nAs the name suggests, TurboRes is extremely performant and can decode ProRes at speeds exceeding 1 GB/s. The following benchmarks compare it to the native FFmpeg CLI and ffmpeg.wasm:\n\n| | ProRes 422 HQ @ 4K | ProRes 4444 @ 1080p | ProRes 422 HQ @ 1080p | ProRes 422 Proxy @ 1080p |\n| - | - | - | - | - |\n| **TurboRes, multithreaded** | **250 FPS** | **763 FPS** | **920 FPS** | **2310 FPS** |\n| FFmpeg native, hardware-accelerated | 160 FPS | 256 FPS | 464 FPS | 466 FPS |\n| FFmpeg native, multithreaded | 107 FPS | 342 FPS | 375 FPS | 948 FPS |\n| ffmpeg.wasm, multithreaded | 84 FPS | 288 FPS | 295 FPS | 706 FPS |\n|  |  |  |  |  |\n| **TurboRes, singlethreaded** | **42 FPS** | **128 FPS** | **158 FPS** | **450 FPS** |\n| FFmpeg native, singlethreaded | 15 FPS | 55 FPS | 57 FPS | 161 FPS |\n| ffmpeg.wasm, singlethreaded | 13 FPS | 50 FPS | 48 FPS | 131 FPS |\n\n> Averaged over 10 runs. Higher is better. Measured on an M4 (4P+6E) MacBook Air with TurboRes 1.2.0 and FFmpeg 7.1.1. \\\n> To reproduce these benchmarks, check out [`benchmark/README.md`](./benchmark/README.md).\n\n## Under the hood\n\nTurboRes easily beats native FFmpeg in performance, which is the result of relentless optimization to make the most out of every CPU cycle. Here's a quick summary of the techniques used:\n\n- The decoding logic is entirely written in Zig, the primary benefit of which is that it emits WebAssembly. WASM via Zig enables a range of features that JavaScript doesn't have, such as manual memory management, SIMD instructions, and easy-to-use shared-memory multithreading.\n- Decoding packets allocates no memory after the first packet and uses barely any additional memory besides storing input and output.\n- Entropy decoding of DC and AC coefficients is almost fully branchless and makes use of ILP (instruction-level parallelism) to decode multiple streams at once on a single CPU core.\n- Bits are read from the data using a 64-bit accumulator-based method while minimizing memory reads.\n- The Inverse Discrete Cosine Transform step makes use of fast SIMD float arithmetic, which beats integer SIMD in WASM.\n- The IDCT itself uses the fast 8x8 AAN (Arai, Agui, Nakajima) algorithm with all scaling factors and dequantization matrices baked into a single initial scaling step.\n- The 8x8 transpose is fully vectorized and so is the final conversion to 16-bit integers.\n- Memory writes to the frame data always use the 128-bit WASM vector type.\n- Frames are split up across threads dynamically such that no thread is ever idle.\n- Pixel format conversions are directly baked into the decoding step, meaning they have no additional overhead.\n- The code itself makes heavy use of inlining and comptime-evaluation, which allows LLVM to better understand data dependencies and output faster code.\n\n## License\n\nTurboRes is licensed under the [Mozilla Public License 2.0](https://www.mozilla.org/en-US/MPL/2.0/), which permits both private and commercial use, but requires that any modifications to MPL-covered files be made available to recipients when the software is distributed.\n\n## Building and development\n\nThis project requires Zig 0.16 and a modern version of Node and npm. To set it up locally, clone the repo, then run `npm install`.\n\nUse `npm run dev` to start the Vite development server, which you can then use to serve any HTML files in this project.\n\nUse `./scripts/build-zig.sh` to compile the Zig code into a debug build, or use `./scripts/build-zig.sh --release` to create an optimized release build.\n\nUse `npm run build` to build the final library.\n\nUse `npm run check` and `npm run lint` to perform typechecking and linting on the project.\n\nUse `npm test` to run the full test suite using the Zig debug build.\n\nUse `npm run demo:dev` and `npm run demo:build` to run and build the demo. Working with the demo assumes that the Zig code has already been built.\n\n## References\n\nThe following resources helped me realize this project:\n- https://wiki.multimedia.cx/index.php/Apple_ProRes (https://web.archive.org/web/20250802070520/https://wiki.multimedia.cx/index.php/Apple_ProRes)\n- https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/proresdec.c\n- https://pub.smpte.org/doc/rdd36/20220909-pub/","readmeFilename":"README.md"}