{"_id":"tlvdemux","_rev":"27-b7cc8aa515ce4e1e81e67054fffa878a","name":"tlvdemux","dist-tags":{"latest":"0.3.6"},"versions":{"0.1.0":{"name":"tlvdemux","version":"0.1.0","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.0","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"0e92b7e2b78ea21b4b9145483bbcecb7549bfdd7","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.0.tgz","fileCount":5,"integrity":"sha512-aVXO2lStSfAlS7qGKgjMrF9tu3QWNxbh3pZt4JTiRrq8TDIfy1tx7mtsJMVICyf+yu2Gdx2pNFdrLdfqpgkH0Q==","signatures":[{"sig":"MEYCIQDGvB2NmUHO0Orj9GfBUu25+1/ZxgR8eeM4syVDAbmb7AIhANTJObaz/sAPyhiT3JZ3N76aFwPuJwvcIH876XnKkAKT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":362853},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.0_1785481269137_0.5061176527066531","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"tlvdemux","version":"0.1.1","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.1","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"fd83b06c565cef6cb49240d135938b732cdf1d1d","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.1.tgz","fileCount":5,"integrity":"sha512-B4fMB4B/UrSaw1T9H5pLq1l3Pkw/g6AezdaxbjPht8jCkMCP6+4fHIXGbNkRWV6b7EZN4Eeotv8vdE7tNGJF+Q==","signatures":[{"sig":"MEQCIGbADw57JApP7EbQyGscnrEUGFmOPo0D/QafRPilSLDbAiAtyEpjY9M9ecA1+1rS7wTq9vBFQ+1AfKo6jgytcGMnQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":364313},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.1_1785488226018_0.7261820755784267","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"tlvdemux","version":"0.1.2","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.2","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"ab5a13256372140902e5fcb77d2784b85904bfb3","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.2.tgz","fileCount":5,"integrity":"sha512-gYqgmEC5z5tBHA5s2wuuokSg2hx6NZuWktzVmQ2wM9XoBorlFWxcxCrc7hVxHLMPr5NptaSko7GDw+byemeMvw==","signatures":[{"sig":"MEYCIQCrTQnWo/CIUH3Lu/9KoxlU3L+wb5FZL4H4EiZT0t0egAIhANHzfIwvaxlbWcCf9MMGHrgYBoe64C6pS5IEBpfglMsM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":380302},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.2_1785569717765_0.3879647642971846","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"tlvdemux","version":"0.1.3","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.3","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"d517219cff54e7a5d30af61a65c54109bde02e74","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.3.tgz","fileCount":5,"integrity":"sha512-PRWOwUtIKYvQrUT7SBOoF1dE2EoFhTrD/zx9Fg3sGjaJkGPeCLZvA2zTkldRvsYotnNfTmuJg/2xhUObaqmbQw==","signatures":[{"sig":"MEYCIQDb2GdeAIArKju60AZN/PHf4Qg1f97AXydFlZ1aOBePwwIhAOchGv/Wgm9YJpNDwEDReeRF6NdZDoAICmWzj267qq9x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":410005},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.3_1785574360237_0.9131839637452412","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"tlvdemux","version":"0.1.4","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.4","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"cf113b1afc1d5448e2396f9b26c2ce4d5e62500c","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.4.tgz","fileCount":6,"integrity":"sha512-63kgfUfBCtDZSufxgUbIjLED1/ggmNUnIit04u4KJMbV5YRRh6ZNpaYcS2OM7YBEtHkvYu6GTNpCRKL1KjyFyA==","signatures":[{"sig":"MEQCIAtDwfHyMq5/30DoX91tlZ7dFR4bmtZK+qoOqE0ArXGQAiAhz7AJIN99UMjJtbbEdR4MhlcqGxMBmu4rZoG/YkjxNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":419969},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.4_1785582318430_0.2460856472621249","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"tlvdemux","version":"0.1.5","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.5","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"2676799c8f6195d9e65f70bae0b0dc28bc365613","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.5.tgz","fileCount":7,"integrity":"sha512-RseRtqKuzJ4zPabFbVW7zZQTb6WNu4mhy/+O29vdYMz/RjmN/hg4F9NxeOkkir6jA0+GwLNGD+nfnYH2Hj8t7A==","signatures":[{"sig":"MEUCIQDivvuNdX3IQpUB2BUomZNl5JE98i5S/+9oB3KWw33lkQIgZuM1X9Y0snDvKsoEWurA58uRFUAfafHNhKPbHwLeH10=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":453484},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.5_1785595748417_0.4163969089106283","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"tlvdemux","version":"0.1.6","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.6","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"3a180ceb6ae6281950689c4364b8aa6c28ab0792","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.6.tgz","fileCount":7,"integrity":"sha512-As1WUjn0MLMy2U2jMq+KjZaT1uNPFk680qtrGJuHprSMVuPGdQMBJ/SDesUkAQEGiyEA8JhqaO2WW/vly4RHug==","signatures":[{"sig":"MEUCIHuVwAP4DUEyuHzPEYWGBrJCmC1nsmIbRB29fdK2Bz94AiEAwpFJDwc2J77bwNDkFTWcQnlxg0E1voKJYmhNHVYK91Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":586313},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.6_1785687566350_0.3856260715053548","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"tlvdemux","version":"0.1.7","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.7","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"91e063459f7564353a4cda60ae91f9fa6565c4bd","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.7.tgz","fileCount":9,"integrity":"sha512-3GxVTtzpZDKrXlk9CA7yp16IRUp9OzOJuokS1UAysQnVL78pKaurewKYUl+c9re2+KBVSyiPNItyMF6kGQUUwg==","signatures":[{"sig":"MEUCIEDt6/ipUUJLS8CnI63SCXtRnAW2HyCjOi/oBgEIVdJ4AiEAjrlnZlHIKDnXASaWccyiDKwlBDhWs6zYcGv7IGgTSzU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":601092},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.7_1785694269167_0.2308717037826773","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"tlvdemux","version":"0.1.8","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.8","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"b386428e0fc83c089e616dfca87b137b5e255678","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.8.tgz","fileCount":9,"integrity":"sha512-rNePhzxIuts1eD97RCNriLYynUt0i16n0bBQJTHSMplnSGhbL6GrGFYtlaSq3MHhYUVm2sWgu+gqTnjAooR+5g==","signatures":[{"sig":"MEYCIQC8FYeUXjVu+EGEkM4z8uuFnVUgpckFUAF82f+tZ1EU/gIhAL8/k1Ny8qPuav8IDtD8mK5gWzshP3cJHqyoR8F1YJSt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":605779},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.8_1785742350439_0.7169971317971966","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"tlvdemux","version":"0.1.9","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.9","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"1cddc4426bf781aca1a778e46207837b77fa6d1a","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.9.tgz","fileCount":9,"integrity":"sha512-CIfYL3ZayIw7Hk2V47NTkhsl4izT79XP+HQizMHmH41s6l6Kpx0mfMPZQn/M/rgRX6k1ueNW5RiuqgVGpmNL4Q==","signatures":[{"sig":"MEYCIQCLd8rTCatVTenhqlLYaH0FsnvUNUOPowhxhFw/ANNJAAIhAPBdD7eeUKVm2krYUcvFFhZUsOh0PaAxVSG4vhHGldjt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":614743},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF -DTLVDEMUX_USE_SYSTEM_LIBARIBTLV=OFF -DTLVDEMUX_LIBARIBTLV_SOURCE_DIR= && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.9_1786437721229_0.8108880604400353","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"tlvdemux","version":"0.1.10","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.10","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"503dbcf8c660d6c94da3f0217ee602f7b943a30e","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.10.tgz","fileCount":9,"integrity":"sha512-dxXOkKflHOIj04omSGkhc3V3oZpjcxptN+RkcS3uf1EyEewmSrTI0QgBNL/rQ8avK4QfTvhnbYM7rEtdJv7BrA==","signatures":[{"sig":"MEYCIQDIaaELnQHcOJLESrKWK9jAP1K8U1jjwJLn8jcOri3roAIhAPl+apdl0KC4lYedTCrDfYVNL8qfXIk9eofPz9xmm5VQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":630913},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/worker_result_value.mjs && node tests/asset_group_selection.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF -DTLVDEMUX_USE_SYSTEM_LIBARIBTLV=OFF -DTLVDEMUX_LIBARIBTLV_SOURCE_DIR= && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.10_1786678479473_0.7222624683175467","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"tlvdemux","version":"0.1.11","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.1.11","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"4fb0fb93d53680af95d4dc46d816438533783166","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.1.11.tgz","fileCount":9,"integrity":"sha512-YCfhnnZyhWaQauIeMcpjN2bkfL1DEtUJf0ewBkQ75WSPtSyvItUZfvZvKm0abH8/zNCTNQmm+79i6AJCNxU4Sg==","signatures":[{"sig":"MEYCIQCvWTPoY8mRxcJg6AqAeAdPLx5ApT6DpfQV7kphaCJOsQIhAPPt8ZlhcCPKo78LXkvEZvpxiWlzrRczmEBmvr+95nst","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":640774},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF -DTLVDEMUX_USE_SYSTEM_LIBARIBTLV=OFF -DTLVDEMUX_LIBARIBTLV_SOURCE_DIR= && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.1.11_1786685084103_0.37492968344963407","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"tlvdemux","version":"0.2.0","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.0","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"9041a3b10b772935c3069bc3933e8fe961acb91c","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.0.tgz","fileCount":9,"integrity":"sha512-7feYDGpIxcbJBLVKglO0D8tclL676d3BD3HEdbd1xmYj8FkUXJbZ9kGdUnuWJ6pgXbBnLWzsgZPzIDEt1vyzsQ==","signatures":[{"sig":"MEUCIQCt2O3KmC9PlXlK2KwXWIezsvYo6weBShimeByqVPEusAIgJaN2JMFz6teBkyEnyrHqYwI8nuAyCpVSyFOYt6Hxo/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":684418},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF -DTLVDEMUX_USE_SYSTEM_LIBARIBTLV=OFF -DTLVDEMUX_LIBARIBTLV_SOURCE_DIR= && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.0_1786726155459_0.6097111171912402","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"tlvdemux","version":"0.2.1","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.1","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"e3cc9d0fb68bf627ca6449bea511b5626f781d66","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.1.tgz","fileCount":9,"integrity":"sha512-8zPbwYqLQTlMe6H50E67PGFoxXGddmX5czLWS2HeYME/MzXkly53vDmrkxAOyOhA6u2IkUYDzZQk8o1NBJHl9w==","signatures":[{"sig":"MEQCIDkgszHcnh+4tymXyBTy4TRFr3GJt8rmrvtO1wlN/vuEAiA36HOFgHJ0x4W8HDmqpGxGmXTxBq+HL23741YGqPW16w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":686503},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF -DTLVDEMUX_USE_SYSTEM_LIBARIBTLV=OFF -DTLVDEMUX_LIBARIBTLV_SOURCE_DIR= && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.1_1786764085499_0.6160589660485876","host":"s3://npm-registry-packages-npm-production"}},"0.2.2-rc1":{"name":"tlvdemux","version":"0.2.2-rc1","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.2-rc1","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"bb261efb8f8504e5f7e9c16be22b012ebfebad26","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.2-rc1.tgz","fileCount":9,"integrity":"sha512-Oketm/1Ty0KhYuHofUwPOVzggRae5Bbx4lpdVwSXV5aMRn5rm13y+oOfcS3sQJWIWKIuv83XZ4J473G9c7OWrQ==","signatures":[{"sig":"MEQCIGcGeqwa1osrjescoOGsOsvAhyNwUr4b2Ln0OIkPD2WZAiAC8HOZfl8gUjwdFRnPcjQuf0QCr/XeA0bBvZLCy1gF+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":707460},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"emcmake cmake -S . -B build-wasm -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DTLVDEMUX_BUILD_TOOLS=OFF -DTLVDEMUX_USE_SYSTEM_LIBARIBTLV=OFF -DTLVDEMUX_LIBARIBTLV_SOURCE_DIR= && cmake --build build-wasm --target tlvdemux-wasm","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.2-rc1_1786785485600_0.3610491977708774","host":"s3://npm-registry-packages-npm-production"}},"0.2.2-rc3":{"name":"tlvdemux","version":"0.2.2-rc3","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.2-rc3","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"b9f41cb63dbbc4504ea5d5403c66b1de5307cb4c","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.2-rc3.tgz","fileCount":11,"integrity":"sha512-os/w9IFgqE727sIfL4UfzlGMG5PQZUg4iStWeXk/LjJk17LrcfT2ljTnBL/tnbsbx4mvEnWgOg7vtggQIeIBhw==","signatures":[{"sig":"MEUCIBu0nWxucS50EFbHhWcZlc8qGpIkcNof1iMjP1n765RyAiEAuOHJv58pbKlZfzZZHgNF7mwqk/wukkxL9/G7HocLro4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":721714},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.2-rc3_1786810560696_0.3412742782264475","host":"s3://npm-registry-packages-npm-production"}},"0.2.2-rc4":{"name":"tlvdemux","version":"0.2.2-rc4","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.2-rc4","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"bef2c6cb31ff2613032bf72de2c9cb2fc42b2ccd","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.2-rc4.tgz","fileCount":11,"integrity":"sha512-OYtL/shljoSgh8hKn0dXJeX50zX38yQ9W/HRVuI56v+o07MxHf4XCxb/yeUo0p++aPZPtiuFim1pRfPjp78zfQ==","signatures":[{"sig":"MEUCIQDuvV5zxqmk00zsZceVBP6xXoUuIdRG5xEZL6Pq/slRQQIgZlYCO0nf/37oooDUxK8qcstbuTYonAHZiUJvAlagj0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":747817},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.2-rc4_1786819764583_0.4619267237850502","host":"s3://npm-registry-packages-npm-production"}},"0.2.2-rc5":{"name":"tlvdemux","version":"0.2.2-rc5","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.2-rc5","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"b1d9aef6fb37d4f5836325d0f2e5ba7ae9dc5c6a","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.2-rc5.tgz","fileCount":11,"integrity":"sha512-ptOP3xOtvlrRi1p40JQSYR3VsqHAaE7Y/II2B8AyHaOPO/Mb1fApye6X/6C8B4K8wDNYYW5hiiOthnLm8cFMFQ==","signatures":[{"sig":"MEYCIQDkvTbbAc1xhP6NW87XPunuelB+1b0cvgO6QCo3fCqZqgIhAL74kLl5kAuFyAh9CCpUi+uu5v8V1eC2/6v6htblKSxm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":748527},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.18.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.2-rc5_1786870750217_0.5225193122999272","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"tlvdemux","version":"0.2.3","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.3","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"a742a887bd5e0988f2eabc076f460edb3b86e50f","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.3.tgz","fileCount":11,"integrity":"sha512-BAJPQAemYhPZMYPIjGl52LlKGxZLQX7vYEfzGzl2kLH+t5d2Z18dAye9upHs8jFXv5iwsQ09BRZBz/Y/lpdcbA==","signatures":[{"sig":"MEUCIQCOkkYGB9zk5sxsoXH3eKGPkkzSkr70+Iynh+vxmBiHIwIgW3w36tQwgerURE3xFBe6ocgsVlH0QkOWpRL+LaEqnig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":745247},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.3_1787076451363_0.06382262203734324","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"tlvdemux","version":"0.2.4","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.2.4","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"1f7bf11ffd1a95446f44bc8b654ce81724497aa0","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.2.4.tgz","fileCount":11,"integrity":"sha512-qzjCmX7jeLNe8H+DCZUJFojBRwrmUGsWQM/yIRzPUZbSUA0JKz+12lQTMSq7HzAqieZhAIiYsMIwq7z+gt5uog==","signatures":[{"sig":"MEUCIQCF48gyzYbonmErDcjrdjAcmxAev0wLi2A/WobhftCTfgIgJiDCvOUaO66KjP2LWWynSSSADKqB/NRVSw4YqrtqO74=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":792724},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./package.json":"./package.json","./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"}},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/mse_append_queue.mjs && node tests/mse_gap_recovery.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.2.4_1787739050656_0.8056230427286097","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"tlvdemux","version":"0.3.0","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.3.0","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"2c7d3eff47649efe12e0a0f101cf1e20a582a3af","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.0.tgz","fileCount":26,"integrity":"sha512-qiT3Xq1xfMrNcxq4wqe1/hWLy2WZg6J+K49+yEI8eF1OCv3LQzRA2C6aUDo7u1j1OUy9dvh2rqwj9n0XEcjNSg==","signatures":[{"sig":"MEQCIHDq24IKbapmKPcYyfXSkQvM1OeOVpPHsJTcSQGf4PX+AiBxq8UySUVsUGSvSpmIXM0Kef403tlZOsORWbAsjFsRNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":935478},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./package.json":"./package.json","./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.3.0_1787902964913_0.9535872313373159","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"tlvdemux","version":"0.3.1","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.3.1","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"f12cfc9cb4c9d38207d6635a0f1f578664a953a4","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.1.tgz","fileCount":26,"integrity":"sha512-5HdsQBq7qiAr0d9pQZPLbpkgUZoX88yxMeNzaL8kNwbvvV9qYga70ur9Z4oZpaT3grWYRFfq8sbcFF8Q8BCQ/A==","signatures":[{"sig":"MEYCIQCENJq3EvVKVQOBiU0fkHUVjfhVmgESVbmrwh9dGV16XgIhAKaRRkD6vVQ2UrUhcc0RXD86537P0mKxooKmThvRtfCh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":937407},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./package.json":"./package.json","./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.3.1_1787904318116_0.9141836142404556","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"tlvdemux","version":"0.3.2","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.3.2","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"a1b913dd3fab4af59282b2b0fb8a154b3dea0be0","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.2.tgz","fileCount":26,"integrity":"sha512-LwFSxPZCOtQR/e0ZzslPg7ErHtVeRGeTXbyMyOrJ3tJqSnhwH7bMkqeXPl2YzpTSI/SDxwhYEFoJSdUF4C6Yfw==","signatures":[{"sig":"MEUCIQDeM30uBiRQ3H4yVeD7IltXqZMKR70eokvoT4OQSSFkeAIgCcCjnTGRdJKe9Z91yZgpAOcvY1Ebh0cbc092Wu1tkLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":940726},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./package.json":"./package.json","./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.3.2_1787906162110_0.4537536737079362","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"tlvdemux","version":"0.3.3","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.3.3","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"0665684e6027812aebf23789ea19d5f5ecd89e44","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.3.tgz","fileCount":26,"integrity":"sha512-GSJLbSsBfcxl3v8exq1yB6L5O9p1kA3zLjd+MRw5a784qjrTQ3W6IZ1LQlTtI7gHmavbUxYZ+MQL9XNlIJT6/g==","signatures":[{"sig":"MEQCIH58Sbi9niXdQVAgfkk2nPl/8CGOCjEseKMxYWuTIvRYAiA7yIECGQplIALVvv/5UG78yIsZ29J0proLuA6n8dEcUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":951175},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./package.json":"./package.json","./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.3.3_1787910536096_0.14943528731163513","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"tlvdemux","version":"0.3.4","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.3.4","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"c9d463240b7b54b9f850812bdf5476dfeffdc93b","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.4.tgz","fileCount":30,"integrity":"sha512-gdI/+ChC3+FJdQVBAIkQo1gK3SYQUzWD4RqYE/Jq6Ol16pOrNZ+8TNnpY1wBAr2gt0/dvDf7w099ZXItIXKwsQ==","signatures":[{"sig":"MEUCIQDuzQ96AqGwdDoUO6E175muzVxXqdJaiFDionbzk3FQCQIgdw9l8292wl+bZdFK8iiMq8r6w80mZBYYCMeChLvhfs8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1035865},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./package.json":"./package.json","./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-live-transition":{"types":"./mse-live-transition.d.ts","import":"./mse-live-transition.mjs","default":"./mse-live-transition.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_resilience.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/mse_live_transition.mjs && node tests/demo_audio_only_contract.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:single-track-resilience":"node tests/wasm_single_track_damage_flow_sample.mjs dist/tlvdemux.js demo/20260828-141-020000_99332dc9-025e-4e76-afc4-e31c3d577059.mmts","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.3.4_1787990649229_0.4111499509748664","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"tlvdemux","version":"0.3.5","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"author":{"url":"https://huggy.moe","name":"huggy","email":"tlvdemux@huggy.moe"},"license":"MIT","_id":"tlvdemux@0.3.5","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"homepage":"https://github.com/makeding/tlvdemux#readme","bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"dist":{"shasum":"9f7a320a0cbf18a9251687268292a038817614ca","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.5.tgz","fileCount":30,"integrity":"sha512-0B9RqYm+NsUcGWhagUoJuENmwWGpJ1q23mDjk4NDrTpqS9rchHPYcJ3yUKAxWNIUaU+ZPtRH9Vmvio5F/cc8zg==","signatures":[{"sig":"MEUCIFNspns+3D7thMHwu4Skyf9OMnmiozrdv/JXqBFsmdgYAiEAvqOmRqDLFH8LoEOKuNzX480wsMhJh3zZVLNtqQXkJBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1037800},"main":"./dist/tlvdemux.js","type":"commonjs","types":"./index.d.ts","unpkg":"./dist/tlvdemux.js","browser":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","default":"./dist/tlvdemux.js","require":"./dist/tlvdemux.js"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./package.json":"./package.json","./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-live-transition":{"types":"./mse-live-transition.d.ts","import":"./mse-live-transition.mjs","default":"./mse-live-transition.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js"},"scripts":{"test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_resilience.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/mse_live_transition.mjs && node tests/demo_audio_only_contract.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:single-track-resilience":"node tests/wasm_single_track_damage_flow_sample.mjs dist/tlvdemux.js demo/20260828-141-020000_99332dc9-025e-4e76-afc4-e31c3d577059.mmts","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only"},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"jsdelivr":"./dist/tlvdemux.js","repository":{"url":"git+https://github.com/makeding/tlvdemux.git","type":"git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","directories":{},"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/tlvdemux_0.3.5_1787993425053_0.9624659439314212","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"tlvdemux","version":"0.3.6","description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","license":"MIT","author":{"name":"huggy","url":"https://huggy.moe","email":"tlvdemux@huggy.moe"},"homepage":"https://github.com/makeding/tlvdemux#readme","repository":{"type":"git","url":"git+https://github.com/makeding/tlvdemux.git"},"bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"type":"commonjs","main":"./dist/tlvdemux.js","types":"./index.d.ts","browser":"./dist/tlvdemux.js","unpkg":"./dist/tlvdemux.js","jsdelivr":"./dist/tlvdemux.js","exports":{".":{"types":"./index.d.ts","require":"./dist/tlvdemux.js","default":"./dist/tlvdemux.js"},"./mse-append-queue":{"types":"./mse-append-queue.d.ts","import":"./mse-append-queue.mjs","default":"./mse-append-queue.mjs"},"./mse-playback":{"types":"./mse-playback.d.ts","import":"./mse-playback.mjs","default":"./mse-playback.mjs"},"./mse-output-pipeline":{"types":"./mse-output-pipeline.d.ts","import":"./mse-output-pipeline.mjs","default":"./mse-output-pipeline.mjs"},"./mse-live-transition":{"types":"./mse-live-transition.d.ts","import":"./mse-live-transition.mjs","default":"./mse-live-transition.mjs"},"./track-selection":{"types":"./track-selection.d.ts","import":"./track-selection.mjs","default":"./track-selection.mjs"},"./stream-input":{"types":"./stream-input.d.ts","import":"./stream-input.mjs","default":"./stream-input.mjs"},"./recorded-source":{"types":"./recorded-source.d.ts","import":"./recorded-source.mjs","default":"./recorded-source.mjs"},"./worker-client":{"types":"./worker-tlvdemux.d.ts","import":"./worker-tlvdemux.mjs","default":"./worker-tlvdemux.mjs"},"./worker/demux-worker-runtime.js":"./worker/demux-worker-runtime.js","./hlg-sdr-renderer":{"types":"./hlg-sdr-renderer.d.ts","import":"./hlg-sdr-renderer.mjs","default":"./hlg-sdr-renderer.mjs"},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"scripts":{"build:wasm":"sh scripts/build-wasm.sh","build:package":"cmake -E make_directory dist && cmake -E copy_if_different build-wasm/tlvdemux.js dist/tlvdemux.js","build":"npm run build:wasm && npm run build:package","benchmark:wasm":"node tests/wasm_benchmark.mjs","test:subtitle-sample":"node tests/wasm_subtitle_metadata_sample.mjs dist/tlvdemux.js demo/test.tlv","test:layer-sample":"node tests/wasm_layer_switch_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv","test:rain-startup-flow":"node tests/wasm_startup_flow_control_sample.mjs dist/tlvdemux.js demo/rain.tlv","test:rain-seek":"node tests/wasm_seek_smoke.mjs dist/tlvdemux.js demo/rain.tlv 60 200 380","test:single-track-resilience":"node tests/wasm_single_track_damage_flow_sample.mjs dist/tlvdemux.js demo/20260828-141-020000_99332dc9-025e-4e76-afc4-e31c3d577059.mmts","test:manual-auto-layer":"node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/audiotrack.tlv restore && node tests/wasm_manual_auto_layer_sample.mjs dist/tlvdemux.js demo/rain.tlv defer","test:inventory-samples":"node tests/inventory_sample_regression.mjs","test:inventory-samples:hardware":"node tests/inventory_sample_regression.mjs --hardware-only","test":"node tests/live_stream_coalescing.mjs && node tests/recorded_source.mjs && node tests/mse_append_queue.mjs && node tests/mse_output_pipeline.mjs && node tests/mse_gap_recovery.mjs && node tests/mse_playback_resilience.mjs && node tests/mse_playback_flow_control.mjs && node tests/mse_recorded_seek.mjs && node tests/mse_live_transition.mjs && node tests/mse_playback_intent.mjs && node tests/demo_audio_only_contract.mjs && node tests/worker_result_value.mjs && node tests/worker_track_selection.mjs && node tests/asset_group_selection.mjs && node tests/subtitle_track_selection.mjs && node tests/hlg_sdr_lut.mjs dist/tlvdemux.js && node tests/hlg_sdr_renderer.mjs && node tests/wasm_smoke.mjs dist/tlvdemux.js && node tests/wasm_transport_metadata.mjs dist/tlvdemux.js"},"_nodeVersion":"24.19.0","_id":"tlvdemux@0.3.6","dist":{"integrity":"sha512-NbydIjEMQMqraOzea6lx441wEP+TcRRARLukgparCu9CkcoHR7HLjNFkeh6kzdo+SHnI57hAp/esUWB8m1Pq9Q==","shasum":"f2b05db17705f00c5337534f528e6b309ee4eddd","tarball":"https://registry.npmjs.org/tlvdemux/-/tlvdemux-0.3.6.tgz","fileCount":31,"unpackedSize":1066115,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICuS19xs+9mQhkS4vkzD1nbyScKU9L6vPqTRiIP3YmlUAiEAiEpmaKXRqaHUUqzXOxjKnZ7tN2KnDXI5ZrkmykQdJdE="}]},"_npmUser":{"name":"huggycn","email":"xiao201361@gmail.com"},"directories":{},"maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tlvdemux_0.3.6_1788123780198_0.7490483249566222"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-31T07:01:08.995Z","modified":"2026-08-30T21:03:00.497Z","0.1.0":"2026-07-31T07:01:09.316Z","0.1.1":"2026-07-31T08:57:06.219Z","0.1.2":"2026-08-01T07:35:17.932Z","0.1.3":"2026-08-01T08:52:40.432Z","0.1.4":"2026-08-01T11:05:18.603Z","0.1.5":"2026-08-01T14:49:08.609Z","0.1.6":"2026-08-02T16:19:26.525Z","0.1.7":"2026-08-02T18:11:09.369Z","0.1.8":"2026-08-03T07:32:30.569Z","0.1.9":"2026-08-11T08:42:01.365Z","0.1.10":"2026-08-14T03:34:39.928Z","0.1.11":"2026-08-14T05:24:44.271Z","0.2.0":"2026-08-14T16:49:15.620Z","0.2.1":"2026-08-15T03:21:25.646Z","0.2.2-rc1":"2026-08-15T09:18:05.757Z","0.2.2-rc3":"2026-08-15T16:16:00.933Z","0.2.2-rc4":"2026-08-15T18:49:24.742Z","0.2.2-rc5":"2026-08-16T08:59:10.365Z","0.2.3":"2026-08-18T18:07:31.529Z","0.2.4":"2026-08-26T10:10:50.825Z","0.3.0":"2026-08-28T07:42:45.067Z","0.3.1":"2026-08-28T08:05:18.268Z","0.3.2":"2026-08-28T08:36:02.265Z","0.3.3":"2026-08-28T09:48:56.241Z","0.3.4":"2026-08-29T08:04:09.372Z","0.3.5":"2026-08-29T08:50:25.203Z","0.3.6":"2026-08-30T21:03:00.334Z"},"bugs":{"url":"https://github.com/makeding/tlvdemux/issues"},"author":{"name":"huggy","url":"https://huggy.moe","email":"tlvdemux@huggy.moe"},"license":"MIT","homepage":"https://github.com/makeding/tlvdemux#readme","keywords":["arib","mmt","tlv","demuxer","webassembly","wasm","hevc","aac"],"repository":{"type":"git","url":"git+https://github.com/makeding/tlvdemux.git"},"description":"ARIB MMT/TLV demultiplexer for browsers, workers, and Node.js","maintainers":[{"name":"huggycn","email":"xiao201361@gmail.com"}],"readme":"# tlvdemux\n\nEnglish | [日本語](README.ja.md)\n\n`tlvdemux` is the C++20 playback, fMP4/MSE and WASM integration layer for\nalready-descrambled ARIB MMT/TLV streams. Its protocol parser and data-broadcast\nresource core is [libaribtlv](https://github.com/makeding/libaribtlv);\n`tlvdemux` keeps player-ready HEVC, AAC-LATM/LOAS and ARIB STD-B62 TTML delivery\nwithout converting the stream to MPEG-TS or exposing FFmpeg ABI types.\n\nThe current implementation provides the stable public callback API, bounded\nincremental TLV resynchronization, compressed-IP context isolation, MMTP\nfragment/aggregation handling, PA/M2/MPT track discovery, descriptor-driven\ntimelines, and HEVC/AAC-LATM/TTML access-unit output.\n\n## Build and test\n\n```sh\nnix-shell\ncmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release\ncmake --build build\nctest --test-dir build --output-on-failure\n```\n\n`libaribtlv` owns the protocol and Zlib dependency. By default CMake fetches its\nHTTPS repository at the pinned revision\n`6ecf9e3b1a8fd95563bc5071213b67b936ea01b3`. Point\n`TLVDEMUX_LIBARIBTLV_SOURCE_DIR` at a local checkout for offline development, or\nset `TLVDEMUX_USE_SYSTEM_LIBARIBTLV=ON` and add an installed package prefix to\n`CMAKE_PREFIX_PATH`. The local source directory takes precedence over both.\nWith a source dependency, `BUILD_TESTING=ON` builds tlvdemux's integration tests\nwithout importing libaribtlv's repository-internal test executables; those run\nin libaribtlv's own CI.\n\nBefore a release, run the local captured-sample inventory gates in addition to\nthe unit suites:\n\n```sh\nnpm run test:inventory-samples\nnpm run test:inventory-samples:hardware  # macOS VideoToolbox\n```\n\nThe software gate requires every `.tlv`/`.mmts`/`.mmt` file in the repository\nroot and `demo/` to have an explicit manifest entry. For every registered sample\nit verifies exact source identity, a duration probe capped at 16 MiB, a bounded\nWASM/MSE playback entry, and a complete WASM/index scan. It also runs the\nsubtitle, layer-selection, manual-to-automatic, rainfall startup/full-sample,\nand 60/200/380-second seek contracts on their owning samples. The macOS gate\nhardware-decodes every sample through the native MSE/VideoToolbox probe, runs\nthe complete rainfall fallback, and repeats the deterministic sixteen-landings\n`8k.mmts` seek probe. Adding or replacing a captured sample without assigning\nthese regressions is a release-gate failure; these large local captures remain\noutside the ordinary package `npm test`.\n\nShared-library builds are enabled by default. Linux produces\n`libtlvdemux.so.0` (with the versioned implementation file), while macOS\nproduces the corresponding `libtlvdemux.0.dylib`. Use\n`-DBUILD_SHARED_LIBS=OFF` when a static `libtlvdemux.a` is preferred.\nThe exported interface is a C++20 ABI, so dynamically linked consumers should\nuse a compatible compiler and C++ standard library.\n\nWhen embedding the project with `add_subdirectory()`, the command-line executable\ncan be disabled with `-DTLVDEMUX_BUILD_TOOLS=OFF`. Tests follow CMake's standard\n`BUILD_TESTING` option.\n\nTagged GitHub releases provide one standalone executable for each supported\nplatform, named `tlvdemux-PLATFORM-ARCH` (with `.exe` on Windows). Rename the\ndownload to `tlvdemux` and, on Unix, mark it executable. It exposes the\nuser-facing tools as subcommands:\n\n```sh\ntlvdemux --help\ntlvdemux probe recording.mmts\ntlvdemux inspect --list recording.mmts\n```\n\nThis unified executable replaces the previously installed `tlvdemux-pipe`,\n`tlvdemux-probe`, `tlvdemux-inspect`, `tlvdemux-extract`, and `tlvanalyze`\nprograms. Existing scripts should insert the corresponding subcommand after\n`tlvdemux`.\n\nOn macOS, the VideoToolbox probe exercises the native part of the browser-facing\nMSE path without launching a browser. It feeds MMTS through the production\n`MseRemuxer`, applies Chromium-compatible coded-frame discontinuity and random\naccess rules, validates `tfdt`/`trun` continuity and HEVC sample flags, and\nsubmits the result to hardware VideoToolbox decoding. `SourceBuffer` rendering\nis a separate integration surface; the direct-rainfall recovery contract below\nis accepted without launching or automating a browser.\n\nThis command covers automatic 4K-to-rainfall video/audio fallback on the edge\nsample:\n\n```sh\n./build/tlvdemux-videotoolbox-probe \\\n  demo/rain.tlv \\\n  --mse --video-packet-id 0xf300 --audio-packet-id 0xf310 \\\n  --fallback-video-packet-id 0xf301 --fallback-audio-packet-id 0xf314 \\\n  --expect-rainfall-init --max-au 30000 --inflight 8\n```\n\nThe following repeats a run at sixteen deterministic random byte landings\nwhile pacing samples at 3x:\n\nThis developer probe is available in source builds and is not included in the\nstandalone release executable.\n\n```sh\n./build/tlvdemux-videotoolbox-probe demo/8k.mmts \\\n  --mse --rate 3 --inflight 4 --max-au 90 \\\n  --random-seeks 16 --seed 20260731\n```\n\nInstall the library, public headers and CMake target export with:\n\n```sh\ncmake --install build --prefix /desired/prefix\n```\n\nThe install includes the playback/MSE library, public headers, the\n`tlvdemux::tlvdemux` CMake package target, the `tlvdemux` executable when enabled,\nand the MIT license. Its CMake package requires an installed `aribtlv` package.\n\n`MseRemuxer` tracks the preferred and rainfall A/V layers independently from\ntheir continuous DTS, observed RAPs, usable AAC, and explicit source-damage\nspans. Automatic playback has only two modes: preferred or rainfall. If the\nactive layer is damaged, the core starts a same-timeline switch when the other\nlayer already has aligned decodable video and audio. Otherwise it emits\n`PlaybackDamage` for the active layer. A recovered span shorter than the\ntwo-second severe threshold with an explicit recovery RAP is a `warning` with\naction `seek-if-stalled`: parser prefetch only arms that recovery and never\nmoves the media clock. A severe recovered span remains `severe` with action\n`seek`, while a span without a recovery RAP remains `wait-for-recovery` until a\nreal RAP arrives. Damage is never retained until EOF and never inferred across\nan unobserved interval.\nEmergency preferred-to-rainfall switching also covers startup. If the selected\npreferred layer has not produced a decodable MSE video entry while the rainfall\nlayer has a real RAP, a following continuous video DTS, continuous AAC, and an\naligned A/V boundary, the core switches immediately with reason\n`health-degradation`. It requests the current playback entry (timestamp zero for\na fresh recording), so cached target history starts at the earliest usable\nrainfall RAP instead of the last observed RAP. It does not wait for a preferred\ndamage event or the five-second health baseline; that baseline applies only\nwhile rainfall playback is healthy and is being considered for an automatic\nreturn to the preferred layer.\nWhile rainfall playback is active, the preferred tracker keeps warming and may\nswitch back after five continuous decodable seconds with aligned RAP/AAC at the\nactual caller-reported playback position. Parser or recording-index progress is\nnever a playback clock: reading healthy preferred media hundreds of seconds\nahead must not replace rainfall media at a playhead that is still at timestamp\nzero. Until a playback position is reported, automatic rainfall-to-preferred\nrecovery remains armed but cannot commit.\nThe normal 8-to-15-second recorded forward buffer is not such unrelated parser\nprogress. A preferred RAP aligned with AAC between the actual playhead and the\n20-second bounded observation frontier is a valid future splice; requiring it\nto fall within two seconds of the playhead makes rainfall restoration\nimpossible under normal flow control. The authoritative\n`20260828-101-180000_4c9f94c3-6ed1-455f-9fee-fcfa8c062de0.mmts` regression keeps\nthe parser eight seconds ahead and must complete rainfall-to-preferred\nrestoration before source presentation time 460 seconds. It must also retain\nexact common A/V seek coverage at displayed time 11:37 (697 seconds) and at the\nnear-boundary 820-second target within the shared 16 MiB budget. A one-second\ngrid through the sample's common A/V interval, media times 1 through 1573\nseconds inclusive, must satisfy that same exact-target and budget contract.\nDamage on the rainfall layer follows the same rule in the opposite direction.\n\n`onMseLayerSwitchStarted`, `onMseLayerSwitch`, and\n`onMseLayerSwitchCancelled` describe the one-shot A/V splice staging; they do\nnot form a separate recovery state machine. SourceBuffer mutations use one\nordered queue: remove, timestamp offset, `changeType`, initialization segment,\nthen media. Every configuration splice on an existing SourceBuffer records the\naffected audio or video track independently, and the next corresponding init\nmust call `changeType()` even when the MIME string is unchanged. Layer switches\ntherefore reconfigure both tracks, while in-content AAC channel-layout and HEVC\nSPS/color-configuration changes reconfigure only the affected track.\nThe 82,837,220-byte `demo/mpegts` regression is an in-content SDR-to-HDR\ntransition on video packet `0xf300`, not evidence that the selected layer is\ndamaged. Playback must remain on `0xf300`; it must never select the rainfall\npacket `0xf301` while installing the new `0xf300` decoder/color configuration.\nThe same boundary also changes the selected `0xf310` AAC layout from 6 channels\nto 2 channels. Both changes must continue through the existing SourceBuffers\nwithout a rainfall-layer switch or a persistent `waiting` at `16.168s`.\nFor an audio splice, `timestampOffsetUs` is the complete absolute\n`SourceBuffer.timestampOffset`, never a relative adjustment. In the cold-start\n`demo/sdr-hdr.tlv` regression, fresh entry alignment first installs\n`-650638us`; the AAC configuration change at source `16938688us` then replaces\nit with `-714638us`, mapping both the old audio end and replacement audio start\nto `16224050us`. That content transition must stay on video packet `0xf300`,\nmust not trigger a layer switch or recovery seek, and must not be concealed by\nselecting the rainfall layer.\nA bare\nMediaElement `waiting` event or a later buffered range never authorizes a seek.\nOnly `PlaybackDamage.action === \"seek\"` for the currently playing layer may\nreposition directly; `seek-if-stalled` is retained as authorization and may be\nexecuted only by a causally matching `waiting`; a late event may use the next\nbuffered parser-observed RAP at or after its current media clock. Explicit PID\nor concrete track selection remains fixed mode and disables automatic layer\ndecisions.\nAt the first usable target RAP, both tracks are logically spliced at that boundary:\nalready-appended old-layer audio after it is removed, and replacement AAC is\nmapped to the same boundary within one 22 ms AAC frame. Old buffered audio must\nnever postpone the video switch to a later RAP. A startup switch can precede\ncreation of the preferred video SourceBuffer: its staged order is still logical\nvideo splice -> rainfall init -> rainfall media, and the absent SourceBuffer is\nnot removed. A discarded staging attempt rebuilds that complete order, including\nthe target init even when the MIME string is unchanged.\n\nFor a fresh recorded playback at timestamp zero, startup and buffered-range\nhandling must not assign `MediaElement.currentTime`. Only an explicit user seek,\na selected-layer `PlaybackDamage.action === \"seek\"` after switching was\nunavailable, a matching `waiting` authorized by `seek-if-stalled` and actual\npresented-frame evidence, or the existing live-start policy may change the\nplayback position.\nThe demo reports that unchanged media clock to the core for recovery decisions;\nthis is observation, not a seek.\n\nBefore a fresh recorded SourceBuffer pair is created, the demo enables atomic\nentry alignment in `createMseOutputPipeline()`. The pipeline stages both init\nsegments and their first media segments until it finds the earliest common A/V\nsource interval, assigns both SourceBuffers the same negative `timestampOffset`\nthat maps that interval's start to timestamp zero, and then commits each queue in\ntimestamp-offset -> init -> media order. An explicit staged splice offset, such\nas a rainfall-layer startup mapping, always takes precedence: entry alignment\nmust neither derive another offset nor add one to the splice mapping. Live,\nexplicit-seek, and reused-MediaSource paths do not enable this fresh-entry mode.\nThe presence of two later, not-yet-mapped track ranges is therefore not an\nimmediate `MSE_STARTUP_NO_COMMON_AV`; fresh startup fails only when no common A/V\nentry can be formed within the existing 16 MiB input budget.\nWhen the first usable rainfall RAP is later than that fresh playback entry, the\nsplice retains the RAP's source presentation time and carries a negative MSE\ntimestamp offset that maps the replacement A/V output onto timestamp zero. The\ndemo applies that offset in the same SourceBuffer mutation queue before the\nreplacement init and media. It applies input backpressure from the common A/V\nbuffered interval, not parser progress: requests stop at 15 seconds ahead and\nresume below 8 seconds. Before any common interval covers the playback entry,\nat most 16 MiB of playback input may be read without progress; exhaustion fails\nwith `MSE_STARTUP_NO_COMMON_AV` instead of fetching the recording to EOF.\n\nLive playback has no timestamp-zero entry. Its startup entry is the first common\nA/V buffered interval produced by the current stream, and the media clock is\naligned to that interval only after the configured live startup buffer is ready.\nFlow control must accept and measure that later interval before the alignment\nwrite occurs; it must never classify valid live A/V merely because the interval\ndoes not cover timestamp zero. If live A/V cannot form any common interval, the\nsame 16 MiB no-progress limit still stops input with\n`MSE_STARTUP_NO_COMMON_AV`.\n\nAn explicit recorded seek is a separate public playback-entry contract. From\nhead discovery through every RAP probe and the final A/V preroll,\n`createMseRecordedSeekSession()` shares one hard 16 MiB source-read budget.\nFrom the first explicit-seek intent until exact selected-video and selected-audio\ncoverage has been appended and committed, that seek owns the demux/MSE\ntransaction. Automatic layer switching is fenced for the complete probe,\nlanding, append, and commit interval: an already pending switch is cancelled,\nnew health or damage observations may warm the same preferred/rainfall trackers\nbut cannot start, complete, or resume an automatic switch, and automatic mode is\nreevaluated only after the exact target is committed. The seek may choose a RAP\nand matching AAC from either member of the automatic pair as its landing source;\nthat choice is part of the explicit seek and is not an automatic layer switch.\nIf the seek fails, is replaced, or terminates, `cancelMseRecordedSeek()` releases\nthe fence without replaying startup, health, or damage decisions accumulated by\nthat uncommitted transaction on later input.\nIt must still preserve the requested `MediaElement.currentTime`, perform one\nformal landing, share the single 16 MiB budget, and never map a nonzero seek back\nto playback entry zero.\nThe MediaElement must not start playback from an earlier partial common range\nwhile that landing is still being appended. The frozen requested `currentTime`\nis installed only at the formal exact-coverage commit, after\n`finishMseRecordedSeek()` succeeds, and playback may start only after that commit.\nFor that commit, successful `SourceBuffer.updateend` events are the append\nacknowledgement, while the remuxer's mapped media-segment intervals are the\nexact coded-coverage evidence. Chromium may report a `SourceBuffer.buffered`\nstart a few milliseconds after the requested time when an HEVC RAP has a later\nPTS than a dependent leading picture. A seek is complete when committed coded\nA/V both cover the exact target and the real common `buffered` range intersects\nthat same committed interval; the imprecise browser boundary must not turn an\notherwise decodable landing into `MSE_SEEK_NO_COMMON_AV`. Browser `buffered`\nalone never relaxes exact coverage, so genuinely later-only A/V still fails.\nThe `819.749134s` regression in the authoritative recording exercises this\ncase: Chromium reports the neighbouring RAP at about `819.752s` while the\ncommitted coded interval covers the requested clock.\nThe monotonic playback-intent token and its single destructive commit lane are\nowned by the public `tlvdemux/mse-playback` SDK, not by the demo. Integrations\ncreate tokens for explicit seeks, layer switches, and recovery candidates and\nmust validate the token and fixed demux identity around every asynchronous read\nor commit. The demo only forwards browser events and installs the SDK-approved\nresult. Playback resilience is inactive for the complete explicit-seek fence;\nlanding-time recovery observations may be logged and used by the one-shot\nconcealment path, but must not change required tracks or replace the frozen\nseek entry clock. The `758.179369s` regression covers this ownership rule: its\ncommitted video interval `758.107362..760.242818s` and committed audio interval\n`756.298716..761.162716s` cover the target and must commit as A/V.\nWhen a worker replays its track catalogue after `reposition()`, acknowledging\nthe already selected non-null video or audio track is idempotent and must not\nreset, flush, or discard the in-flight seek landing.\nOverlapping probe and landing ranges are reused, and no source request is issued\nafter exhaustion. Head discovery, probes, and landing use 1 MiB reads so a\nsingle coarse read cannot consume one eighth of that shared budget before the\nstable recovery RAP is reached. A RAP before the requested media time is valid\npreroll: seek continues until the common buffered A/V interval covers the requested time,\nthen normal 15-second/8-second backpressure resumes. The probe records RAPs only\nthrough target + 50 ms. It stops as soon as it observes a RAP not later than\nthe target within the two-second preroll window; otherwise it stops when the\nobserved candidate frontiers pass the target. It selects the closest acceptable\nobserved RAP not later than the target without waiting for an unobserved layer.\nProbe interpolation seeds its earlier anchor from the public\nunion start at source offset zero, then retains the closest observations before\nand after the target instead of an access-unit history whose anchors can age\nout. Each candidate reads at most one two-second probe window before the next\ninterpolation, and observed RAPs remain eligible across those candidates. This\nprevents a variable-bitrate estimate on the wrong side of the target from\nturning into an unbounded sequential scan. If one side is still unavailable,\nthe next bounded probe moves backward by one probe window. It must not bisect\ntoward the file head and spend the shared budget in an unrelated earlier\ninterval. An A/V landing requires its\nchosen RAP to precede the target by at least one second; a closer RAP triggers one\nbounded earlier probe so AAC begins before the exact target. The recording's\nearliest available RAP is the only exception when no earlier input exists. At\nthe formal landing, the sole reposition uses that RAP's safe restart offset.\nBefore the sequential landing input, the session gives the HEVC remuxer the\noriginal source target as a one-shot recorded-seek concealment target. It remains\narmed across out-of-PTS-order input\nuntil exact entry coverage succeeds or the landing fails, then the session\nexplicitly clears it. No second reposition occurs. If that target\nlies in a selected-video source-damage episode, the\nremuxer fills only that hole with a still picture after the existing stable-GOP\ncheck: it extends the last complete pre-damage sample to the stable RAP decode\nboundary, or, when landing contains no earlier picture, duplicates the stable\nRAP first frame at the target while retaining the original RAP at its original\nDTS/PTS. AAC remains on its original continuous timeline. This fill never moves\n`MediaElement.currentTime`, performs another landing seek, rescans the source,\nor increases the shared 16 MiB budget. Later-only or otherwise disjoint raw A/V\nis therefore valid when the fill creates common coverage at the exact target.\nNo usable pre-damage frame and no stable following RAP, no RAP, EOF, remaining\ndisjoint A/V, or budget exhaustion fails with `MSE_SEEK_NO_COMMON_AV` and stops\nreading. It must never be reported as `MSE_STARTUP_NO_COMMON_AV`, cause a hidden\nmedia-element seek, or fall back to scanning the complete recording.\nEvery recorded-seek failure snapshots the requested target, phase, exact-entry\ndecision, committed coded A/V ranges, real browser-buffered A/V ranges, and\nshared-budget consumption before cancellation so the failed boundary can be\ndistinguished without another instrumented rerun.\n\nFor automatic dual-video recordings, the public recorded timeline is the union\nof the preferred and rainfall video presentation ranges. The recording start is\nthe earlier first video frame, the recording end is the later last video frame\nincluding that track's inferred final-frame duration, and public duration is\n`end - start`. Media time zero maps to that union start; the other video layer\nkeeps its original offset from the same origin. Duration display,\n`MediaSource.duration`, fresh startup, explicit recorded seek, selected-layer\ndamage recovery, and MSE timestamp offsets must all use this one mapping. An\nexplicit `videoPacketId` intentionally restricts the range to that single video\ntrack instead of forming the automatic pair's union.\n\nSelected-layer automatic recovery remains distinct from an explicit recorded\nseek. A current-layer severe `PlaybackDamage.action === \"seek\"` with a concrete\nrecovery timestamp may move the media clock exactly once using the same\nunion-origin mapping. A short recovered `warning` uses `seek-if-stalled`: it is\nregistered without moving the clock and may execute at most once per causal\n`waiting` after the media clock has reached that damage. `MediaElement.currentTime`\nand `playing` are not proof that damaged video decoded: audio may advance the\nmedia clock beyond the first recovery RAP while the visible frame remains\nstalled. The SDK therefore tracks compositor-presented video PTS through\n`requestVideoFrameCallback()`. A presented frame at or beyond the first recovery\nRAP retires the authorization; otherwise a late `waiting` selects the earliest\nparser-observed RAP at or after the current media clock that is already buffered.\nIf that RAP has not arrived or been appended yet, the authorization remains\narmed until access-unit or SourceBuffer progress makes it usable. This recovery\nmust always move forward; it must never jump backward to an already-passed RAP.\nThis state machine is part of the public `tlvdemux/mse-playback` SDK; the demo\nonly supplies its media/layer callbacks and forwards parser RAPs, `waiting`, and\nSourceBuffer progress. Browsers without presented-frame callbacks use the safe\nlegacy subset and may recover only while the media clock has not passed the\nfirst recovery RAP. Neither recovery path may restart duration probing, scan the\nsource, or run concurrently with an A/V layer switch. A buffered range without\na parser-observed RAP, damage on an inactive layer, ordinary `waiting`, and\n`wait-for-recovery` never authorize a seek.\n\nWhen the selected video remains unpresentable after three different,\nstrictly-forward, parser-observed recovery RAP attempts, the public playback\nresilience controller enters `audio-only` with the stable code\n`TLV_VIDEO_UNAVAILABLE`. This is a fourth playback mode beside\n`audio-video`, `recovering-video`, and `restoring-video`; it does not change\n`PlaybackDamage.action` or its severity thresholds. A current-layer damage\nauthorization, a causal `waiting` after each attempted RAP, and the absence of\na newly presented video frame are all required. Ordinary waiting, a paused\nMediaElement, an explicit seek, a layer/audio-track switch, stale generation,\nor damage on an inactive video track must never enter audio-only playback.\nThe integration explicitly forwards the visible MediaElement's `pause` and\n`play` lifecycle through `notifyPlaybackPaused()` and\n`notifyPlaybackResumed()`. A pause freezes waiting consumption, recovery-RAP\nattempts, audio-only decisions, and restore commits without clearing the current\ndamage episode, stable RAP, or prior attempts. Resume only removes that freeze:\nrecovery may continue after a new causal `waiting` event or a newly presented\nvideo frame, never from a waiting or buffer event retained across the pause. No\ndamage-recovery path may call `play()` on the visible MediaElement.\n\nAudio-only playback changes the MSE required-track set to audio, so startup,\nbuffer coverage, backpressure, and recorded-seek landing do not wait for the\nvideo SourceBuffer. Inactive video output is discarded immediately and never\nforms an unbounded transition cache. A runtime in-place switch is accepted only\nafter the video SourceBuffer is actually absent from `activeSourceBuffers`;\notherwise the integration must build a fresh audio-only MediaSource. Recorded\nrebuilds reuse the public index/seek session and its single 16 MiB read budget.\nThey are resource transactions: the old MediaSource remains attached with its\ncurrent audio, media clock, and user play/pause intent while a bounded hidden\ncandidate is built from the cached duration/index. Only a fully buffered\naudio-only candidate, or an A/V candidate whose restore RAP was actually\npresented, may be promoted. Pause may retain candidate buffers but forbids\ncandidate playback and commit. Any open, format, seek, append, or decode failure\ndiscards only the candidate; it must not detach, stop, seek, or otherwise mutate\nthe old MediaSource.\nLive integrations retain bounded current input while the replacement audio\npipeline becomes playable; they must not reconnect or stop feeding the existing\naudio pipeline. The audio clock remains authoritative throughout the transition.\n`createLiveMseTransitionManager()` owns the 4 MiB candidate MediaSource queue,\nreceives the same ongoing demux output as the active pipeline, and commits a\nrestored A/V candidate only after its hidden probe MediaElement reports the\ntarget frame through `requestVideoFrameCallback()`. Commit promotes that still-attached\ncandidate MediaElement; detaching and reattaching its object URL is forbidden because\nthe MSE detach algorithm empties both SourceBuffer lists.\n\nWhile audio-only playback continues, each real RAP strictly after the audio\nclock is eligible for one restore attempt. Restoration stays in\n`restoring-video` until a common A/V candidate is buffered and\n`requestVideoFrameCallback()` proves a frame at or after that RAP was actually\npresented. A failed candidate leaves the current audio playback untouched and\nreturns to `audio-only` to await a later RAP; it must not seek backward, repeat a\nRAP, or call `play()` over a user pause. Explicit seek, track/layer selection,\ngeneration replacement, and source end cancel the transition. The demo renders\nthese structured SDK modes in a fixed video-stage slot and shows\n“映像を復旧できないため、音声のみ再生しています。利用可能になり次第、自動的に戻ります。\n[TLV_VIDEO_UNAVAILABLE]” without exposing retry counts or timers.\n\nRecoverable AAC source-damage markers must not discard already queued audio or\nrestart the selected audio fragment timeline. Missing AAC frames are compacted\nonto the next 1024-sample boundary so subsequent fragments remain contiguous;\notherwise Chromium reports `DEMUXER_UNDERFLOW` while video is buffered and the\ncommon A/V buffer remains near zero. The captured\n`20260828-101-021500_8deb3dd2-39e9-471c-a9ba-a6dfe23feeb6.mmts` regression must\nadvance audio buffering despite repeated audio discontinuity markers.\n\nThe Worker client treats every public `Uint8Array` input as caller-owned.\n`TlvDemuxer.push()`, duration-probe `pushRange()`, and `setMseEdid()` transfer an\nSDK-owned copy and must never detach the caller's `ArrayBuffer`. In particular,\nan explicit seek may reuse cached source bytes across probe and landing without\nthrowing a detached-`ArrayBuffer` error or initiating another seek.\n\nThe `rain.tlv` validation contract requires its first automatic switch at the\nearliest rainfall RAP (currently about `821944us`), before any preferred-layer\ninit, the later approximately 46-second preferred damage event, or any seek. The\nsource switch boundary remains `821944us`, while its startup timestamp offset\nmaps the first common MSE A/V interval to timestamp zero. The first target init\nmust be `1920x1080/L123`, the full WASM run must contain no\n`PlaybackDamage.seek`, and the switch A/V boundaries must differ by at most one\n22 ms AAC frame. Startup flow-control acceptance must reach that common interval\nwithout consuming more than the 16 MiB no-progress budget and must stop normal\nprefetch at the 15-second high-water mark rather than reading the 711 MiB sample\nto EOF. The previously observed switch around 0:48 and its `-12909` are the\nfailure being corrected, not an acceptable switch point. Automated\nacceptance uses the native VideoToolbox MSE probe plus the full-sample WASM\nassertions; it must not invoke browser automation or ask a user to be the\nruntime tester.\n\nThe captured single-layer sample\n`20260828-141-020000_99332dc9-025e-4e76-afc4-e31c3d577059.mmts` is exactly\n`1792861104` bytes and `496.913089` seconds. It contains only video packet\n`0xa140` and audio packet `0xa141`, with no rainfall fallback. Its full-sample\nregression must expose short selected-video damage as `seek-if-stalled` with the\ncomplete source span, input offsets, and a real recovery RAP. Parser prefetch\nmust not seek. The observed browser boundary is a `waiting` near `6.580s` after\nthe first mapped recovery RAP at `6.272934s`, while the visible video frame has\nnot recovered. The SDK must select the next parser-observed forward RAP at\n`6.806806s`, seek there exactly once after it is buffered, and continue. A stale\nor unrelated `waiting` must not seek forward or backward. Real-browser\nacceptance must also exercise the current demo with this sample and show that\nnatural late stall recovery, continuing without a rainfall switch, MediaSource\nrebuild, recorded-seek session, or whole-source reread.\n\nAssigning `MediaElement.currentTime` to a recovery RAP does not complete a short\ndamage recovery. The authorization remains armed until the compositor presents\na frame at or beyond its first recovery RAP. Each subsequent causally matching\n`waiting` may consume at most one strictly later parser-observed, buffered RAP;\nparser or SourceBuffer progress alone must not ladder through recovery points.\nThe observed second boundary in this sample is `waiting` at `13.245s`, a first\nattempt at `13.747079s`, and another `waiting` at `13.747s` while the last\npresented video frame remains `7.291s`. That second event must retain the same\ndamage authorization and advance to the next real RAP at `14.280934s`, never\nrepeat `13.747079s`. Only an actually presented recovery frame completes the\nauthorization and prevents later unrelated `waiting` events from seeking.\nThe same sample's observed `waiting` at media time `101.810s` is deliberately\nordinary waiting: there is no selected-video damage at that clock. Damage\nalready discovered by parser prefetch starts at mapped media time `114.097s`\nand recovers at the real RAP `115.315189s`; it remains retained for that future\nboundary and must not authorize a seek or audio-only transition at `101.810s`.\nDemo diagnostics label these mapped values as playback time and explicitly mark\nfuture damage as prefetched instead of printing source PTS beside the current\nMediaElement clock.\nThe same rule applies while the MediaElement still reports `seeking` for the\nSDK-owned recovery target: the observed `6.589s -> 6.806806s -> 7.340679s`\nattempts can produce another causal `waiting` at `7.341s` before `seeked`.\nBecause that clock still matches the last SDK attempt and presented video is\nstill behind the first recovery RAP, the event must advance to the next real\nRAP at `7.874540s`. A `seeking` state at any unrelated target remains blocked.\nAn authorized recovery seek only writes the recovery target. It never calls\n`play()` on the visible MediaElement; the browser's existing playback intent\ncontinues to own play/pause. A genuinely user-paused element, or ordinary\n`waiting` without a matching selected-video damage authorization, must never\nstart playback.\n\nRecovery also requires decodable MSE media after the damage boundary. A\nselected-video source-damage marker seals and emits every complete valid video\nsample before the loss and retains the existing source timeline mapping. The\nfirst real RAP then opens a bounded observation period: its GOP is discarded,\nanother source-damage marker vetoes it, and video output resumes only at the\nnext real RAP after one complete damage-free GOP. No candidate GOP is cached.\nIn the authoritative sample, the `99.201500–99.351650s` and\n`99.468433–99.485117s` islands must not be emitted; stable output resumes at\nsource PTS `100.269228s` while AAC remains continuous. Startup, explicit seek,\ntrack/layer switching, and undamaged input still start at their first RAP.\nThe observation period is armed only after the selected-video generation has\nalready accepted media. A source-damage marker at fresh startup, including one\ncarried by the first RAP, must therefore start at that first real RAP without\nwaiting for another clean GOP; it must form the initial common A/V entry within\nthe same 16 MiB no-progress budget.\n\nManual-to-automatic layer selection is an active transition, not only a policy\nflag. If the user has manually selected the rainfall layer, enabling automatic\nselection must reactivate the preserved preferred/fallback health observations\nand immediately stage a coordinated return to healthy preferred video and its\ncorresponding audio at the next usable RAP. An unavailable or damaged preferred\nlayer keeps the usable rainfall output instead of leaving a switch pending to\nEOF. Re-enabling automatic mode also supersedes an unfinished manual request.\nA manual layer selection made before the initial common A/V entry is established\nmaps both replacement tracks to that playback entry; its normal preroll must not\nbe misreported as `MSE_STARTUP_NO_COMMON_AV`.\n\n## Library usage\n\nThe staged plan for moving the remaining shared browser playback behavior into\nthe public SDK is documented in [Browser playback SDK convergence plan](docs/browser-sdk-roadmap.md).\n\nBrowser integrations import the recorded-seek coordinator instead of copying\ndemo probe logic:\n\n```js\nimport {createMsePlaybackFlowControl, createMseRecordedSeekSession}\n  from 'tlvdemux/mse-playback';\n\nconst flowControl = createMsePlaybackFlowControl({\n  media, queues, entryKind: 'seek', entryTimeSeconds: targetSeconds,\n});\nconst seek = createMseRecordedSeekSession({\n  targetTimeSeconds: targetSeconds,\n  source, durationUs, demuxer, media, queues, flowControl,\n  headReady: () => selectedVideo !== null,\n});\ncallbacks.onTrack = track => seek.observeTrack(track);\ncallbacks.onTrackRemoved = track => seek.observeTrackRemoved(track);\ncallbacks.onAccessUnit = unit => seek.observeAccessUnit(unit);\nconst {nextOffset} = await seek.run();\n```\n\nThe coordinator accepts synchronous native-WASM methods and Promise-returning\nworker wrappers, so a DPlayer adapter can use the same lifecycle.\n\nImplement `aribtlv::Sink`, keep it alive for the lifetime of the demuxer, and\nfeed arbitrary-sized chunks synchronously:\n\n```cpp\n#include <aribtlv/demuxer.hpp>\n\nclass PlayerSink final : public aribtlv::Sink {\npublic:\n    void onService(const aribtlv::ServiceInfo& service) override;\n    void onTrack(const aribtlv::TrackInfo& track) override;\n    void onAccessUnit(aribtlv::AccessUnit&& unit) override;\n    void onError(const aribtlv::Error& error) override;\n};\n\nPlayerSink sink;\naribtlv::Demuxer demuxer(sink);\ndemuxer.push(data, size);\ndemuxer.flush();\n```\n\n`push()` does not retain the input pointer. Callback payloads own their data,\nand malformed stream data is reported through `onError()` while parsing\ncontinues where recovery is possible. Call `reset()` when replacing the input\nstream; service and track selection policies are retained.\n\nAudio tracks expose their MH audio component metadata through\n`TrackInfo::audio`, including the signalled channel layout, component type,\nmain-component flag and sampling rate. Select tracks from this metadata rather\nthan assuming packet IDs remain fixed between programmes.\n\n### Demuxer lifecycle\n\nTreat each demuxer instance as one logical input session. The important\nboundaries are different operations rather than interchangeable ways to clear\nthe parser:\n\n- `push()` accepts arbitrary chunk boundaries. Native callbacks and direct-WASM\n  media/signalling callbacks run synchronously inside the call; callback-\n  lifetime byte views must be consumed before it returns. Direct WASM queues\n  application-resource assembly separately as described below.\n- `flush()` closes the current contiguous input span. It emits complete buffered\n  access units, reports and drops incomplete fragments, and makes any later\n  media resume at a discontinuity (video waits for a RAP). It does not destroy\n  the demuxer, clear discovered metadata, finalize a recording index, or call\n  `MediaSource.endOfStream()`. Call it at a real EOF or intentional input\n  boundary, not whenever a live network read is temporarily empty.\n- `reposition(offset, true)` seeks within the same source. It preserves track\n  selections and the normalized media timeline, uses `offset` as the new\n  absolute input position, waits for a selected video RAP, and marks the first\n  output from each track discontinuous. Pass `false` only when the new position\n  should establish a new timeline origin. In the WASM wrapper, completed\n  application VFS files survive a reposition while incomplete carousel\n  assembly is discarded.\n- `reset()` replaces the logical source. Parser, service/track catalogue,\n  timeline, application resources, offsets and error counters are cleared, but\n  explicit service/track selections and construction options are retained. An\n  active WASM recording index is restarted empty. Clear or reselect retained\n  track IDs if the replacement source uses different IDs.\n- `selectService()` is a service-session change, not a media seek. It clears\n  service-scoped tracks, timing and application resources; select new tracks\n  from the subsequent `onTrack` callbacks.\n- At permanent EOF, call `flush()`, then `finalizeIndex()` if indexing was\n  enabled. Let asynchronous SourceBuffer/application consumers drain before\n  ending MSE. WASM objects must finally be released with `delete()`; in native\n  code the `Sink` must outlive the `Demuxer`.\n\n### Browser MSE queue\n\nBrowser integrations can reuse the SourceBuffer state machine shipped by the\npackage instead of duplicating append, trim, retry and worker-backpressure\nlogic in each player:\n\n```js\nimport {\n  MseAppendQueue,\n  finalizeMseMediaSource,\n} from 'tlvdemux/mse-append-queue';\n\nconst videoQueue = new MseAppendQueue(mediaSource, video, videoMime);\nvideoQueue.append(initSegment);\nvideoQueue.append(mediaSegment);\nawait videoQueue.waitBelow(4 * 1024 * 1024);\n\nawait finalizeMseMediaSource(mediaSource, [videoQueue, audioQueue], {\n  // Enable only when the demuxer reported an incomplete physical input tail.\n  truncateToCommonEnd: incompleteInputTail,\n});\n```\n\nThe queue counts both pending and in-flight bytes, recomputes ownership after\nevery `updateend`, serializes `appendBuffer()` and `remove()`, retries Chromium\nquota pressure, and rejects detached or failed SourceBuffers. The finalizer\nwaits for both tracks before `endOfStream()`; for a physically truncated input\nit can first remove an unmatched A/V tail and finish on the last common coded\nframe. It does not hide malformed-input errors or truncate complete recordings.\n\n## Data-broadcast applications and virtual files\n\nApplication-resource collection is enabled by default. While media access units\nare emitted, the demuxer also combines application signalling, data-directory\ntables, asset-management tables and out-of-order data units into complete files.\n`Sink` receives `onApplicationState`, `onApplicationResource`, and\n`onApplicationResourcesReset` events. An application becomes `Ready` when its\nAIT entry path is present; other referenced files may continue arriving from the\nbroadcast carousel.\n\nCollection readiness and broadcast-requested application lifecycle are\nindependent. `state` describes virtual-file availability: `ready` means that\nthe entry document exists, not that every referenced resource has arrived or\nthat an HTML runtime is running. `lifecycle` maps the AIT `controlCode`:\n\n| `controlCode` | Reported `lifecycle` | Receiver responsibility |\n| --- | --- | --- |\n| `0x01` AUTOSTART | `autostart-pending` until the entry exists, then `autostart-ready` | Start only after it is ready and receiver policy permits it. |\n| `0x02` PRESENT | `present` | Make the application available for presentation; this is not proof that it was launched. |\n| `0x04` KILL | `killed` | Stop any active runtime/session. Cached files may remain until a resource reset. |\n| `0x05` PREFETCH | `prefetching` until the entry exists, then `prefetched` | Collect/cache resources without presenting the application. |\n| any other value | `unsupported` | Do not infer a launch action. |\n\n`tlvdemux` reports these transitions but never launches, reloads or terminates\nthe application runtime itself. The host owns that state machine, including\nidempotent start/stop behavior, UI policy and the security boundary. In the\nWASM API, `reset()` and `selectService()` clear the completed VFS and emit\n`onApplicationResourcesReset`; `reposition()` deliberately retains completed\nfiles. A `killed` application can therefore still have `state: \"ready\"` until\nthe host closes it or the resource session is reset.\n\nDirect WASM callers must also drive application assembly explicitly. Call\n`drainApplicationResources(maxEvents)` after input batches and schedule another\ndrain when it returns `true`; a value of `0` drains all events currently queued.\nAfter `flush()`, drain until it returns `false` before reading the final VFS or\ndeleting the demuxer. The demo worker wrapper performs this scheduling\nautomatically so large carousel decompression cannot block media input.\n\nCompleted bytes are moved to the sink rather than retained indefinitely by the\ndemuxer. Native hosts can keep them in the thread-safe\n`ApplicationResourceStore`, whose `get`, `list`, and `waitFor` methods are\nintended for a loopback HTTP/WebView adapter:\n\n```cpp\nclass ReceiverSink final : public aribtlv::Sink {\npublic:\n    aribtlv::ApplicationResourceStore files;\n\n    void onApplicationState(const aribtlv::ApplicationState& state) override {\n        files.onApplicationState(state);\n    }\n    void onApplicationResource(aribtlv::ApplicationResource&& resource) override {\n        files.onApplicationResource(std::move(resource));\n    }\n    void onApplicationResourcesReset() override {\n        files.onApplicationResourcesReset();\n    }\n    // Implement the four required media/error callbacks as usual.\n};\n```\n\nThe store contains no socket or HTTP dependency. A native application may bind\na separate server to `127.0.0.1` and answer a request with\n`files.waitFor(context_id, path, timeout)`. WASM callers normally keep the same\nevents in a JavaScript `Map` and expose them through a Service Worker instead.\n\nResource collection can be disabled with\n`Limits::collect_application_resources`. `Limits` also bounds pending item\ncount/bytes, catalogue size, and decompressed file size so a malformed carousel\ncannot grow memory without limit.\n\n## Pipe into FFmpeg\n\n`tlvdemux pipe` remuxes the first matching HEVC video and AAC-LATM audio tracks\nto a non-seekable fragmented MP4 stream on stdout. Diagnostics are written only\nto stderr, so the output can be connected directly to FFmpeg:\n\n```sh\n./build/tlvdemux pipe recording.mmts |\n  ffmpeg -f mp4 -i pipe:0 -c copy output.mp4\n\ncurl 'http://MIRAKURUN/api/services/SERVICE_ID/stream?decode=0' |\n  ./build/tlvdemux pipe - |\n  ffmpeg -f mp4 -i pipe:0 -c:v copy -c:a aac output.mkv\n```\n\nUse `--service ID`, `--video-packet-id ID`, or `--audio-packet-id ID` when the\nautomatic first-track selection is not the desired programme. Both video and\naudio codec configuration must arrive before output begins. `-f mp4` is\nrecommended because a pipe has no filename extension and the broadcast may\ntake time to deliver its initialization data.\n\nFor video-only consumers such as thumbnail extraction, `--video-only` emits a\nsingle-track fragmented MP4 without waiting for or remuxing audio:\n\n```sh\n./build/tlvdemux pipe --video-only recording.mmts |\n  ffmpeg -f mp4 -skip_frame nointra -i pipe:0 -frames:v 10 -f null -\n```\n\nWhen a finite consumer closes the pipe after receiving all requested frames,\n`tlvdemux pipe` treats the closed stdout as normal consumer cancellation.\n`--audio-packet-id` cannot be combined with `--video-only`.\n\n## Inspect a stream\n\n```sh\n./build/tlvdemux inspect --list test.tlv\n./build/tlvdemux inspect --trace-au test.tlv\n./build/tlvdemux inspect --video video.hevc --audio audio.loas \\\n  --subtitle subtitle.ttml test.tlv\n./build/tlvdemux inspect --audio secondary.loas \\\n  --audio-packet-id 0xf311 test.tlv\n./build/tlvdemux analyze test.tlv\n```\n\nFor TTML tracks, `inspect --list` reports the B60 subtitle signalling fields,\nincluding `compression=0`, `compression=1` (schema-informed EXI), or\n`compression=2` (schema-less EXI). With `--trace-au`, each subtitle access\nunit also reports `subtitle-compression`, a payload classification\n(`xml`, `exi`, or `binary`), and its first bytes, so a real EXI sample can\nbe identified before handing it to a renderer.\n\n`tlvdemux analyze` scans the complete recording and inventories reconstructed\nARIB-HTML5 resources. For each virtual file it reports its path, MIME type,\ndecoded size and CRC32, carousel occurrence count, exact duplicate count, and\nduplicate payload bytes. Duplicate classification compares the complete wire\npayload; unknown, discontinuous, or changed units are reported but never\ncounted as removable.\n\nUse Mirakurun's raw 4K path with `decode=0` when capturing validation input:\n\n```sh\ncurl 'http://MIRAKURUN/api/services/SERVICE_ID/stream?decode=0' > test.tlv\n```\n\nFor a live source-colour baseline, `scripts/compare_qvc_color.py` pulls QVC\nCS161 (MPEG-TS service `700161`) and BS4K 221 (MMT/TLV service `1100221`) at\nthe same time, aligns their picture content, and records ten minutes of\nlinear-light statistics by default:\n\n```sh\npython3 scripts/compare_qvc_color.py --tlvdemux ./build/tlvdemux\n```\n\nRaw broadcast bytes and decoded frames are not saved. The report, complete\nprocess logs and small aligned PPM previews are written below\n`color-comparisons/`. The CS source is decoded as BT.709 SDR and the BS4K\nsource as BT.2020 HLG, then both are converted to linear BT.709 for analysis.\nThis diagnostic deliberately does not apply tlvdemux's SDR-in-HLG rewrite or\nHLG-to-SDR LUT; those are candidate implementations, not the source baseline.\nQVC CS161 is a bitrate-limited MPEG-2 service and is naturally softer than the\nBS4K HEVC service. Use it as the simulcast SDR luma reference, not as a target\nfor BS4K spatial detail or local colour richness.\n\nTo measure the current project SDR result against that reference, enable the\nexplicit candidate path. This makes `tlvdemux pipe` rewrite strict HLG\n`9/18/9` signalling to `9/1/9`, exports the exact C++ 8-bit 3D LUT, and applies\nit with trilinear interpolation before the same analysis:\n\n```sh\npython3 scripts/compare_qvc_color.py --tlvdemux ./build/tlvdemux \\\n  --bs-mode current-sdr\n```\n\nTo measure the same `1/13/9` carrier and prototype LUT as the browser demo,\nselect `prototype-sdr`.\n\n```sh\npython3 scripts/compare_qvc_color.py --tlvdemux ./build/tlvdemux \\\n  --duration 15 --fps 4 --max-offset 5 --snapshot-interval 5 \\\n  --bs-mode prototype-sdr\n```\n\nThe corresponding low-level tools are also available directly:\n\n```sh\ntlvdemux hlg-sdr-lut > current-hlg-sdr.cube\ntlvdemux hlg-sdr-lut --prototype > prototype-hlg-sdr.cube\ncurl 'http://MIRAKURUN/api/services/SERVICE_ID/stream?decode=0' |\n  tlvdemux pipe --video-only --sdr-in-hlg - |\n  ffmpeg -f mp4 -i pipe:0 -f null -\ncurl 'http://MIRAKURUN/api/services/SERVICE_ID/stream?decode=0' |\n  tlvdemux pipe --video-only --hlg-sdr-prototype - |\n  ffmpeg -f mp4 -i pipe:0 -f null -\n```\n\n`--sdr-in-hlg` is explicit and fixed for the selected video track. It does not\ncopy the browser demo's display-dependent `auto` policy into the CLI.\n\nWhen more than one track of a kind is present, the diagnostic dumper writes the\nfirst discovered supported track of that kind. `--trace-au` still reports every\nemitted track.\n\nThe library assumes any required B61 descrambling has already happened before\nthe bytes reach `Demuxer::push()`. In the validation setup, Mirakurun\n`decode=0` preserves the MMT/TLV stream while the tuner/frontend path supplies\nalready-usable media payloads. B61 message-authentication metadata is parsed so\nan appended authentication code is not exposed as part of the media payload;\ncryptographic verification itself remains the caller's responsibility.\n\n## WebAssembly\n\nInstall the prebuilt single-file WebAssembly package from npm:\n\n```sh\nnpm install tlvdemux\n```\n\nThe package works with CommonJS directly and with the usual default-import\ninterop in ESM-aware bundlers:\n\n```js\nimport createTlvDemuxModule from \"tlvdemux\";\n\nconst module = await createTlvDemuxModule();\nconst demuxer = new module.TlvDemuxer({\n  onTrack: track => console.log(track),\n  onAccessUnitView: unit => consumeSynchronously(unit),\n  onError: error => console.warn(error),\n});\n```\n\nFor MSE players, `mseMaxAudioChannels` can reject layouts above the browser's\nchosen limit without rewriting the AAC configuration. For example, a value of\n`6` keeps mono through 5.1 tracks and suppresses a 22.2-channel AAC init\nsegment. Use `track.audio.channels` in `onTrack` to select a compatible\nalternative track; omitted or zero leaves the remuxer unlimited.\n\n#### Excluding BS8K 22.2-channel audio\n\nSome BS8K programmes carry 22.2-channel (24-channel) AAC audio, represented by\n`channel_configuration=13`. Chromium-based browsers do not accept this layout\nthrough MSE, which may cause an audio `appendBuffer()` call to raise a\nMediaError. For browser playback, setting the limit to six channels as shown\nbelow allows mono through 5.1 while preventing a 22.2-channel MSE init segment\nfrom being emitted.\n\n```js\nlet selectedAudio = false;\nconst demuxer = new module.TlvDemuxer({\n  mseMaxAudioChannels: 6,\n  onTrack(track) {\n    const channels = track.audio?.channels ?? 0;\n    if (!selectedAudio && track.kind === \"audio\" &&\n        (channels === 0 || channels <= 6)) {\n      selectedAudio = true;\n      demuxer.selectTrack(\"audio\", track.trackId);\n    }\n  },\n  onMseInit: init => appendInitSegment(init),\n  onMseSegment: segment => appendMediaSegment(segment),\n});\n```\n\nThis setting does not downmix 22.2-channel audio to 5.1. It is a safeguard that\nkeeps unsupported audio out of MSE. When multiple audio tracks are available,\nuse `track.audio.channels` to choose a 5.1 or stereo alternative. If the option\nis omitted or set to `0`, no channel-count limit is applied.\n\nTypeScript declarations for the module, callbacks, events, duration probe and\nrecording index are included. The npm package contains the generated wrapper\nwith its WebAssembly binary embedded, so consumers do not need Emscripten and\ndo not make a separate `.wasm` request.\n\n### HLG to SDR renderer\n\n`TlvDemuxer.hlgSdrColorLut()` returns a packed RGB 3D LUT generated by the C++\ncolour implementation. Import `HlgSdrRenderer` from\n`tlvdemux/hlg-sdr-renderer` and pass that LUT to `setColorLut()`. The WebGPU and\nWebGL backends then perform the same trilinear lookup; tone curves and colour\ntransforms do not live in separate JavaScript shaders. The older\n`hlgSdrToneMappingLut()` 1D API remains temporarily available for compatibility\nbut should not be used by new integrations. `setMseToneMappingMode('on_compare')`\nuses the same MSE signalling as `force`; pair it with\n`HlgSdrRenderer.setComparisonEnabled(true)` to leave the left half without the\nLUT and apply the LUT to the right half.\n\n### iOS and iPadOS Safari\n\nThe WASM demuxer itself runs on current iOS Safari, including the `BigInt`\nvalues used by the public API. Player integrations must not assume that the\nstandard `MediaSource` constructor exists, however: iOS exposes the compatible\n`ManagedMediaSource` API instead. Select the constructor once and use it for\nboth capability checks and construction:\n\n```js\nconst BrowserMediaSource = globalThis.ManagedMediaSource || globalThis.MediaSource;\nif (!BrowserMediaSource?.isTypeSupported(mime)) throw new Error(`Unsupported: ${mime}`);\nconst mediaSource = new BrowserMediaSource();\n```\n\nRegister the `sourceopen` listener before assigning the object URL to the video\nelement, then attach it and begin playback. `demo/demo.js` implements this\npath. `demo/ios-compat.html` is a small feature and end-to-end diagnostic page;\nit reports WASM, HEVC/AAC, MSE/MMS and SourceBuffer results separately.\n\nDo not use the iOS Simulator as the final ManagedMediaSource playback verdict.\nWebKit bug 266764 documents that the simulator can expose the API but never\nopen the source. Confirm the SourceBuffer stage on physical iPhone/iPad\nhardware. See also WebKit's ManagedMediaSource integration example:\n\n- https://webkit.org/blog/15036/how-to-use-media-source-extensions-with-airplay/\n- https://bugs.webkit.org/show_bug.cgi?id=266764\n\n### Build the npm package\n\nBuild the browser/worker wrapper with Emscripten:\n\n```sh\nnix-shell\nemcmake cmake -S . -B build-wasm -G Ninja \\\n  -DBUILD_SHARED_LIBS=OFF -DTLVDEMUX_BUILD_TOOLS=OFF\ncmake --build build-wasm --target tlvdemux-wasm\n```\n\nFrom `nix-shell`, `npm run build` performs the same release build and copies the\nresult to `dist/tlvdemux.js`. `npm pack --dry-run` runs the release build and\nWASM smoke test before showing the exact files that would be published.\n\nThe result is a single self-contained `build-wasm/tlvdemux.js`; the WebAssembly\nbinary is embedded and no separate `.wasm` request is made. Load it as a normal\nscript and create a demuxer asynchronously:\n\n```js\nconst module = await createTlvDemuxModule();\nconst demuxer = new module.TlvDemuxer({\n  onTrack: track => console.log(track),\n  onEventInfo: event => console.log(event.title, event.startTimeUnixMilliseconds),\n  onStreamEvent: event => console.log(event.eventMessageTag, event.messageId),\n  onAccessUnitView: unit => consumeSynchronously(unit),\n  onApplicationState: application => console.log(application.state),\n  onApplicationResourceView: resource => console.log(resource.path),\n  onError: error => console.warn(error),\n});\n\ndemuxer.push(chunk); // Uint8Array; copied into WASM memory\ndemuxer.flush();\ndemuxer.delete();\n```\n\nFor loaders that already manage buffers, `_malloc`, `_free`, `HEAPU8`, and\n`pushFromHeap(address, size)` provide a reusable heap-buffer path. JavaScript\nreceives 64-bit offsets, timestamps, and track IDs as `BigInt` values.\nMH-EIT current/following and schedule entries are reported through\n`onEventInfo`; `tableId === 0x8b` with `sectionNumber` 0/1 identifies the\npresent/following event for the service.\nARIB STD-B60 EMT messages are reported through `onStreamEvent`. The event\ncontains the MPT-signalled EMT tag, group/id/version, private bytes, and the raw\ntime-mode fields so the receiver can ignite timed messages against its playback\nclock instead of the demux/read-ahead clock. `rawMessageId` preserves B60's\n16-bit descriptor field; its high octet is exposed as `messageId` and its low\noctet as `messageVersion` to the B62 application.\n`onAccessUnitView` avoids copying media output, but its `data` view is valid only\nfor the duration of the callback and must be consumed synchronously. Use\n`onAccessUnit` instead when the callback needs an owned `Uint8Array` copy.\n`onApplicationResourceView` has the same callback-only lifetime; use\n`onApplicationResource` for an owned copy.\n\n`TlvDemuxer` also owns an `ApplicationResourceStore`. `applicationResources()`\nlists its files, `applicationResource(contextId, path)` returns an owned file,\n`applications()` reports current application states, and\n`applicationEntry(contextId)` resolves the ready entry document. This keeps\npath validation, version replacement, and entry resolution in C++/WASM rather\nthan duplicating those rules in each browser loader.\n\nRun the application-resource WASM integration test against a captured stream\nwith:\n\n```sh\nnode tests/wasm_application_resources.mjs build-wasm/tlvdemux.js test.tlv\n```\n\n`DurationProbe` drives fast head/tail reads without owning a file or HTTP\nclient. Start it with the known file size, fulfill each object returned by\n`nextRange()`, and pass the exact bytes to `pushRange()`. A successful\n`duration()` has `status: \"complete\"`; failure remains explicit through\n`state()` and `failure()` and never falls back to downloading the whole file.\nThe native `tlvdemux probe INPUT` command exercises the same protocol.\n\nFor precise recorded seek, call `startIndex(false)` before feeding the full\nstream and `finalizeIndex()` at its real EOF. `seekPointsFor(targetUs)` returns\nthe surrounding RAP checkpoints. Reposition to `first.signallingOffset`, feed\nfrom there, decode from the emitted RAP, and present the first frame at or after\nthe requested time.\n\nThe recording index has a lifecycle separate from the demux session. A VOD\nscan starts in `building`; `finalizeIndex()` makes its duration and seek points\ncomplete. Use `startIndex(true)` for a growing recording and finalize only when\nthe source has permanently stopped growing. `reposition()` preserves the\ncurrent index, whereas `reset()` or `selectService()` restarts an active index\nfrom empty. `flush()` alone never finalizes it.\n\n### Browser demo\n\nBuild the sibling `libaribhtml5` receiver SDK and `build-wasm/tlvdemux.js`, then\nserve the repository root and open `/demo/`:\n\n```sh\n(cd ../libaribhtml5 && pnpm build:sdk)\nnode demo/server.mjs\n```\n\nThe bundled development server supports the `206` and `Content-Range`\nresponses required by duration probing and recorded seek. Python's basic\n`python3 -m http.server` is not suitable for this demo because it does not\nprovide the required Range behavior.\n\nThe demo accepts either a local MMTS file or an HTTP URL, probes its duration,\nthen plays the selected HEVC and AAC tracks through Media Source Extensions.\nEvery fresh playback entry starts at timestamp zero. The demo intentionally has\nno preset seek-and-pause comparison buttons; later positioning is only an\nexplicit user seek.\nApplication resources collected by WASM are exposed to a sandboxed data-\nbroadcast iframe through the same-origin Service Worker VFS shipped by\n`libaribhtml5`. The receiver API, video-plane handling, document preparation,\nbuilt-in ROM sounds, and remote-control behavior also come from\n`libaribhtml5`; external application URLs remain blocked.\nLocal files use `Blob.slice()`; remote files require validated `206` and\n`Content-Range` responses. Live mode skips duration probing and seeking, uses a\nnormal streaming `GET`, and exposes the Media Source as an unbounded timeline.\nHTTP URLs that do not return a valid Range response automatically fall back to\nLive mode.\nThe demo contains a deliberately small fMP4/MSE layer and does not depend on\nmmts.js at runtime. Browser HEVC MSE support is still required.\n\nDemuxing and fMP4 remuxing run in the public `worker/demux-worker-runtime.js`. The main\nthread sends input chunks as transferable buffers and receives only MSE init\nsegments, media segments, subtitle payloads, application files, and small\ncontrol events. `worker-tlvdemux.mjs` owns the RPC facade and\n`worker/demux-worker-runtime.js` is a self-contained classic Worker entry that\ncan also be bundled by a consumer's Worker loader. Keeping UI outside this\npublic pair lets consumers change presentation without copying the RPC or\nworker-side demux lifecycle.\n\nRun the repeatable WASM throughput benchmark with:\n\n```sh\nnpm run benchmark:wasm -- build-wasm/tlvdemux.js test.tlv 268435456\n```\n\nIt reports demux-only and demux-plus-MSE throughput, callback/segment counts,\noutput bytes, and maximum observed WASM heap size. See\n[`docs/performance.md`](docs/performance.md) for the hot-path ownership map,\nmeasurement guidance, and regression checklist.\n\n## Current scope\n\nVersion 0.1 supports the ARIB broadcast subset exercised by the validation\nstreams: all four HCfB compressed-IP modes (`0x20`, `0x21`, `0x60`, `0x61`),\nMMTP signalling and fragmented media, HEVC Annex B, AAC-LATM/LOAS, and ARIB\nSTD-B62 TTML. The recording helpers provide bounded duration probing, sparse RAP\nindexing, and recording-relative repositioning. CAS/descrambling, decoder and\nTTML rendering, persistent index serialization, and general-purpose ISO MMT are\noutside the library's current scope.\n","readmeFilename":""}