{"_id":"@cooljapan/oximedia","_rev":"6-4ee3d9a2c5d120565b9b0d5e1d18429b","name":"@cooljapan/oximedia","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"@cooljapan/oximedia","version":"0.1.0","license":"Apache-2.0","_id":"@cooljapan/oximedia@0.1.0","maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"homepage":"https://github.com/cool-japan/oximedia","bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"dist":{"shasum":"654f204d70d23c235bfc25f79cbacb09f64ca083","tarball":"https://registry.npmjs.org/@cooljapan/oximedia/-/oximedia-0.1.0.tgz","fileCount":6,"integrity":"sha512-Oq1zUwnZnvgGYepeV0PnK1F/NHQ/qzni40isaz4JSkS63SY5pwyC95HuqEf6pwL/wBojOLobJ0dg03aPhQa7Pw==","signatures":[{"sig":"MEUCIQDpxfNmbW3lF/nqr+B9Ws5qde2HZuLc5UNex3YZyITdUgIgRD7cEP0COrS2OegrJRYWWGB7942C1uopFxe6u++tkds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160685},"main":"oximedia_wasm.js","type":"module","types":"oximedia_wasm.d.ts","gitHead":"39c5975aed9c15fb5c4e05ce8a0cb1150428db26","_npmUser":{"name":"kitasan","email":"info@kitasan.io"},"repository":{"url":"git+https://github.com/cool-japan/oximedia.git","type":"git"},"_npmVersion":"11.2.0","description":"WebAssembly bindings for OxiMedia","directories":{},"sideEffects":["./oximedia_wasm.js","./snippets/*"],"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/oximedia_0.1.0_1772979111794_0.049227648381648725","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cooljapan/oximedia","version":"0.1.1","license":"Apache-2.0","_id":"@cooljapan/oximedia@0.1.1","maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"homepage":"https://github.com/cool-japan/oximedia","bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"dist":{"shasum":"3550839fc1c0e2e7cfc9a1adaf67370298ab8d88","tarball":"https://registry.npmjs.org/@cooljapan/oximedia/-/oximedia-0.1.1.tgz","fileCount":6,"integrity":"sha512-3WhqClzHGzBqsYYJusyyvzWax2ViAcRtYM+AB4LdcWuhIN2yq2GIRoH2eWe8Cg9uvM/lrQIm0nfFjvl/yl/P5g==","signatures":[{"sig":"MEUCIQCYaQ/SA5O997XzYk8UicS7paCUcjIh+CF32Wrd5oTk3wIgWlPYtK9vP3LBx4G9PyNXKNYI/fJUYiH+mgsiA4o4TDU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5024142},"main":"oximedia_wasm.js","type":"module","types":"oximedia_wasm.d.ts","gitHead":"4cda58d9e73b4f9e0e74db7b0932ac5ae9c5b2b8","_npmUser":{"name":"kitasan","email":"info@kitasan.io"},"repository":{"url":"git+https://github.com/cool-japan/oximedia.git","type":"git"},"_npmVersion":"11.2.0","description":"WebAssembly bindings for OxiMedia","directories":{},"sideEffects":["./oximedia_wasm.js","./snippets/*"],"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/oximedia_0.1.1_1773200530537_0.5861764308152975","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cooljapan/oximedia","version":"0.1.4","license":"Apache-2.0","_id":"@cooljapan/oximedia@0.1.4","maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"homepage":"https://github.com/cool-japan/oximedia","bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"dist":{"shasum":"28d12387e64b86a92698579808484316d3a12b7a","tarball":"https://registry.npmjs.org/@cooljapan/oximedia/-/oximedia-0.1.4.tgz","fileCount":6,"integrity":"sha512-CtwproXHLUrcowr8U2CnOanerrz88VrMGA9WWkeq5nxIYvY2wzc9oOPoc408CVNkUFb8/gH4BxJEaG05l+0aZg==","signatures":[{"sig":"MEUCIF1Hd4m+fZAhoZLYrqw0VMQElXieLM/dqa+Y//eKQy6JAiEAhg8NXdFMVbR972Fa3ZwbKqvu+jFqcxQvLcgzXbSqoRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4414681},"main":"oximedia_wasm.js","type":"module","types":"oximedia_wasm.d.ts","_npmUser":{"name":"kitasan","email":"info@kitasan.io"},"repository":{"url":"git+https://github.com/cool-japan/oximedia.git","type":"git"},"_npmVersion":"10.9.7","description":"WebAssembly bindings for OxiMedia","directories":{},"sideEffects":["./oximedia_wasm.js","./snippets/*"],"_nodeVersion":"22.22.2","collaborators":["COOLJAPAN OU (Team Kitasan)"],"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/oximedia_0.1.4_1776645877290_0.3284553579955307","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cooljapan/oximedia","version":"0.1.5","license":"Apache-2.0","_id":"@cooljapan/oximedia@0.1.5","maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"homepage":"https://github.com/cool-japan/oximedia","bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"dist":{"shasum":"e5295298dee8cf847dba53c2b5ecac9c6e8a95ef","tarball":"https://registry.npmjs.org/@cooljapan/oximedia/-/oximedia-0.1.5.tgz","fileCount":6,"integrity":"sha512-/CFKdf5BU99nYznkDJEcAUySenFzl4ZtnZBcIAdYQj1M0TKzDS78YeoZ0u+gce+be+prM5nBZaWVdE1dymAsdw==","signatures":[{"sig":"MEYCIQDUuiW+4gEE6V67vNT73xEmXVUP/Q2y84syhf0SHDw9XwIhAKmzGNHsWRWATNZPdjk099LN7f1gjAwTlTEP1sg5Qhlp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4417738},"main":"oximedia_wasm.js","type":"module","types":"oximedia_wasm.d.ts","_npmUser":{"name":"kitasan","email":"info@kitasan.io"},"repository":{"url":"git+https://github.com/cool-japan/oximedia.git","type":"git"},"_npmVersion":"10.9.7","description":"WebAssembly bindings for OxiMedia","directories":{},"sideEffects":["./oximedia_wasm.js","./snippets/*"],"_nodeVersion":"22.22.2","collaborators":["COOLJAPAN OU (Team Kitasan)"],"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/oximedia_0.1.5_1776764480551_0.8919440006051065","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@cooljapan/oximedia","version":"0.1.6","license":"Apache-2.0","_id":"@cooljapan/oximedia@0.1.6","maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"homepage":"https://github.com/cool-japan/oximedia","bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"dist":{"shasum":"707dcdfe7e076368e1375c803d6da7e70c5b8df1","tarball":"https://registry.npmjs.org/@cooljapan/oximedia/-/oximedia-0.1.6.tgz","fileCount":6,"integrity":"sha512-pvIj5bISeecSRA+v5FHZeUQ9JsFY1CzJ+NumSB2XvhVKSRZII5Y+ntmnGC0Srb9AC0dKeCDlG6adpnOF7JVhTQ==","signatures":[{"sig":"MEQCIESzKJ8RoX8KZnCqorw7hjRlTU4mNnu42l8mhW3aI45fAiAiW4zGB3aVLRi7PXVDFYeIiDwJ6qfTzFbTTeLR/wVuOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4404433},"main":"oximedia_wasm.js","type":"module","types":"oximedia_wasm.d.ts","_npmUser":{"name":"kitasan","email":"info@kitasan.io"},"repository":{"url":"git+https://github.com/cool-japan/oximedia.git","type":"git"},"_npmVersion":"10.9.7","description":"WebAssembly bindings for OxiMedia","directories":{},"sideEffects":["./oximedia_wasm.js","./snippets/*"],"_nodeVersion":"22.22.2","collaborators":["COOLJAPAN OU (Team Kitasan)"],"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/oximedia_0.1.6_1777196121295_0.5295460166234811","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@cooljapan/oximedia","type":"module","collaborators":["COOLJAPAN OU (Team Kitasan)"],"description":"WebAssembly bindings for OxiMedia","version":"0.1.7","license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/cool-japan/oximedia.git"},"main":"oximedia_wasm.js","homepage":"https://github.com/cool-japan/oximedia","types":"oximedia_wasm.d.ts","sideEffects":["./oximedia_wasm.js","./snippets/*"],"_id":"@cooljapan/oximedia@0.1.7","bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-uwr1x9z4S/SSwc9LOWoSXHSwXpdQyjpeE3rQJKlSATDahym8opmaHt3zHkf9I5yXXP6U5VaiHH3qIrjX/IZ7Kg==","shasum":"963cbe5975614227603dfc6f079a560cf47fa465","tarball":"https://registry.npmjs.org/@cooljapan/oximedia/-/oximedia-0.1.7.tgz","fileCount":6,"unpackedSize":4623094,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDjus4TFJvec0lB7uIpKN1dOtbc/zL1TFf83KBubJXwNAiEA9Jj4RJIOgtdPeKSz8A0DqyN4h6FQA1pSlH9OdK+OnWg="}]},"_npmUser":{"name":"kitasan","email":"info@kitasan.io"},"directories":{},"maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oximedia_0.1.7_1779416313826_0.26024725530025283"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-08T14:11:51.659Z","modified":"2026-05-22T02:18:34.175Z","0.1.0":"2026-03-08T14:11:51.938Z","0.1.1":"2026-03-11T03:42:10.712Z","0.1.4":"2026-04-20T00:44:37.547Z","0.1.5":"2026-04-21T09:41:20.773Z","0.1.6":"2026-04-26T09:35:21.541Z","0.1.7":"2026-05-22T02:18:34.028Z"},"bugs":{"url":"https://github.com/cool-japan/oximedia/issues"},"license":"Apache-2.0","homepage":"https://github.com/cool-japan/oximedia","repository":{"type":"git","url":"git+https://github.com/cool-japan/oximedia.git"},"description":"WebAssembly bindings for OxiMedia","maintainers":[{"name":"kitasan","email":"info@kitasan.io"}],"readme":"# OxiMedia WASM\n\nWebAssembly bindings for OxiMedia - Patent-free multimedia processing in the browser.\n\n## Features\n\n- **Format Probing**: Detect container formats (WebM, Matroska, Ogg, FLAC, WAV, MP4)\n- **Container Demuxing**: Extract compressed packets from media files\n- **Zero-Copy**: Efficient buffer management using JavaScript `ArrayBuffer`\n- **Patent-Free**: Only supports royalty-free codecs (AV1, VP9, VP8, Opus, Vorbis, FLAC)\n- **Browser-Native**: No file system dependencies, works entirely in-memory\n\n## Installation\n\n### From npm\n\n```bash\nnpm install @cooljapan/oximedia\n```\n\nAvailable as three packages:\n- `@cooljapan/oximedia` (bundler — for webpack, vite, rollup, etc.)\n- `@cooljapan/oximedia-web` (browser — `<script type=\"module\">`)\n- `@cooljapan/oximedia-node` (Node.js — `require()`)\n\n### From Source\n\n#### Prerequisites\n\n- [Rust](https://rustup.rs/) (1.75 or later)\n- [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/)\n\nInstall wasm-pack:\n\n```bash\ncargo install wasm-pack\n```\n\n### Building\n\nBuild for different targets:\n\n```bash\n# Build for all targets (web, node, bundler)\n./build.sh\n\n# Build for web only (development mode with debug symbols)\n./build-dev.sh\n\n# Build for specific target\nwasm-pack build --target web --out-dir pkg\n```\n\nAvailable targets:\n- `web`: For use in browsers via `<script type=\"module\">`\n- `nodejs`: For use in Node.js\n- `bundler`: For use with webpack, rollup, parcel, etc.\n\n## Usage\n\n### In the Browser\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>OxiMedia WASM Demo</title>\n</head>\n<body>\n    <input type=\"file\" id=\"fileInput\" accept=\"video/*,audio/*\">\n    <pre id=\"output\"></pre>\n\n    <script type=\"module\">\n        import init, * as oximedia from './pkg-web/oximedia_wasm.js';\n\n        async function run() {\n            // Initialize the WASM module\n            await init();\n\n            console.log('OxiMedia version:', oximedia.version());\n\n            // Handle file input\n            document.getElementById('fileInput').addEventListener('change', async (e) => {\n                const file = e.target.files[0];\n                const arrayBuffer = await file.arrayBuffer();\n                const data = new Uint8Array(arrayBuffer);\n\n                // Probe format\n                try {\n                    const result = oximedia.probe_format(data);\n                    console.log('Format:', result.format());\n                    console.log('Confidence:', result.confidence());\n                    console.log('Description:', result.description());\n\n                    // Create demuxer\n                    const demuxer = new oximedia.WasmDemuxer(data);\n                    const probe = demuxer.probe();\n\n                    // Get streams\n                    const streams = demuxer.streams();\n                    let output = `Format: ${probe.format()}\\n`;\n                    output += `Streams: ${streams.length}\\n\\n`;\n\n                    for (const stream of streams) {\n                        output += `Stream ${stream.index()}:\\n`;\n                        output += `  Codec: ${stream.codec()}\\n`;\n                        output += `  Type: ${stream.media_type()}\\n`;\n                        const params = stream.codec_params();\n                        if (params.has_video_params()) {\n                            output += `  Resolution: ${params.width()}x${params.height()}\\n`;\n                        }\n                        if (params.has_audio_params()) {\n                            output += `  Sample Rate: ${params.sample_rate()} Hz\\n`;\n                            output += `  Channels: ${params.channels()}\\n`;\n                        }\n                        output += '\\n';\n                    }\n\n                    // Read some packets\n                    let packetCount = 0;\n                    while (packetCount < 10) {\n                        const packet = demuxer.read_packet();\n                        if (!packet) break;\n                        output += `Packet ${packetCount}: `;\n                        output += `stream=${packet.stream_index()}, `;\n                        output += `size=${packet.size()} bytes, `;\n                        output += `keyframe=${packet.is_keyframe()}\\n`;\n                        packetCount++;\n                    }\n\n                    document.getElementById('output').textContent = output;\n                } catch (e) {\n                    console.error('Error:', e);\n                    document.getElementById('output').textContent = 'Error: ' + e;\n                }\n            });\n        }\n\n        run();\n    </script>\n</body>\n</html>\n```\n\n### With a Bundler (webpack, vite, etc.)\n\n```javascript\nimport init, * as oximedia from 'oximedia-wasm';\n\nasync function processMedia(data) {\n    // Initialize WASM module\n    await init();\n\n    // Probe format\n    const result = oximedia.probe_format(data);\n    console.log('Detected format:', result.format());\n\n    // Create demuxer\n    const demuxer = new oximedia.WasmDemuxer(data);\n    demuxer.probe();\n\n    // Get streams\n    const streams = demuxer.streams();\n    console.log('Found', streams.length, 'streams');\n\n    // Read packets\n    let packet;\n    while ((packet = demuxer.read_packet()) !== null) {\n        console.log('Packet:', packet.stream_index(), packet.size());\n    }\n}\n```\n\n### In Node.js\n\n```javascript\nconst fs = require('fs');\nconst { probe_format, WasmDemuxer } = require('./pkg-node/oximedia_wasm');\n\n// Read file\nconst data = fs.readFileSync('video.webm');\n\n// Probe format\nconst result = probe_format(data);\nconsole.log('Format:', result.format());\n\n// Demux\nconst demuxer = new WasmDemuxer(data);\ndemuxer.probe();\n\nconst streams = demuxer.streams();\nconsole.log('Streams:', streams.length);\n```\n\n## API Reference\n\n### Functions\n\n#### `probe_format(data: Uint8Array): WasmProbeResult`\n\nDetects the container format from raw bytes.\n\n**Parameters:**\n- `data`: At least the first 12 bytes of the file\n\n**Returns:** `WasmProbeResult` with format and confidence\n\n**Throws:** Exception if format cannot be detected\n\n### Classes\n\n#### `WasmDemuxer`\n\nSynchronous demuxer for extracting packets from containers.\n\n**Constructor:**\n- `new WasmDemuxer(data: Uint8Array)`\n\n**Methods:**\n- `probe(): WasmProbeResult` - Detect format and parse headers\n- `streams(): WasmStreamInfo[]` - Get stream information\n- `read_packet(): WasmPacket | null` - Read next packet (null at EOF)\n- `size(): number` - Total size in bytes\n- `position(): number` - Current position in bytes\n- `is_eof(): boolean` - Check if all packets have been read\n\n#### `WasmProbeResult`\n\nResult of format probing.\n\n**Methods:**\n- `format(): string` - Container format name\n- `confidence(): number` - Confidence score (0.0 to 1.0)\n- `description(): string` - Human-readable description\n- `is_video_container(): boolean` - Check if video container\n- `is_audio_only(): boolean` - Check if audio-only container\n\n#### `WasmStreamInfo`\n\nInformation about a media stream.\n\n**Methods:**\n- `index(): number` - Stream index\n- `codec(): string` - Codec name\n- `media_type(): string` - Media type (\"Video\", \"Audio\", \"Subtitle\")\n- `is_video(): boolean` - Check if video stream\n- `is_audio(): boolean` - Check if audio stream\n- `duration_seconds(): number | undefined` - Duration in seconds\n- `timebase_num(): number` - Timebase numerator\n- `timebase_den(): number` - Timebase denominator\n- `codec_params(): WasmCodecParams` - Codec parameters\n- `metadata(): WasmMetadata` - Stream metadata\n\n#### `WasmPacket`\n\nCompressed media packet.\n\n**Methods:**\n- `stream_index(): number` - Stream index\n- `size(): number` - Packet size in bytes\n- `data(): Uint8Array` - Packet data\n- `is_keyframe(): boolean` - Check if keyframe\n- `is_corrupt(): boolean` - Check if potentially corrupt\n- `pts(): number` - Presentation timestamp\n- `dts(): number | undefined` - Decode timestamp\n- `duration(): number | undefined` - Packet duration\n\n## Supported Formats\n\n### Containers\n- Matroska (.mkv)\n- WebM (.webm)\n- Ogg (.ogg, .opus, .oga)\n- FLAC (.flac)\n- WAV (.wav)\n- MP4 (.mp4) - AV1/VP9 only\n\n### Video Codecs\n- AV1\n- VP9\n- VP8\n- Theora\n\n### Audio Codecs\n- Opus\n- Vorbis\n- FLAC\n- PCM\n\n## License\n\nApache-2.0\n\nVersion: 0.1.5 — 2026-04-20 — 505 tests\n\n## See Also\n\n- [OxiMedia](https://github.com/cool-japan/oximedia) - The main Rust library\n- [wasm-bindgen](https://rustwasm.github.io/wasm-bindgen/) - Rust/WASM interop\n- [wasm-pack](https://rustwasm.github.io/wasm-pack/) - WASM build tool\n","readmeFilename":"README.md"}