avbridge 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/{chunk-6UUT4BEA.cjs → chunk-2IJ66NTD.cjs} +13 -20
  3. package/dist/chunk-2IJ66NTD.cjs.map +1 -0
  4. package/dist/{chunk-XKPSTC34.cjs → chunk-2XW2O3YI.cjs} +5 -20
  5. package/dist/chunk-2XW2O3YI.cjs.map +1 -0
  6. package/dist/chunk-5KVLE6YI.js +167 -0
  7. package/dist/chunk-5KVLE6YI.js.map +1 -0
  8. package/dist/{chunk-2PGRFCWB.js → chunk-CPJLFFCC.js} +8 -18
  9. package/dist/chunk-CPJLFFCC.js.map +1 -0
  10. package/dist/chunk-CPZ7PXAM.cjs +240 -0
  11. package/dist/chunk-CPZ7PXAM.cjs.map +1 -0
  12. package/dist/{chunk-QQXBPW72.js → chunk-E76AMWI4.js} +4 -18
  13. package/dist/chunk-E76AMWI4.js.map +1 -0
  14. package/dist/{chunk-NV7ILLWH.js → chunk-KY2GPCT7.js} +347 -665
  15. package/dist/chunk-KY2GPCT7.js.map +1 -0
  16. package/dist/chunk-LUFA47FP.js +19 -0
  17. package/dist/chunk-LUFA47FP.js.map +1 -0
  18. package/dist/chunk-Q2VUO52Z.cjs +374 -0
  19. package/dist/chunk-Q2VUO52Z.cjs.map +1 -0
  20. package/dist/chunk-QDJLQR53.cjs +22 -0
  21. package/dist/chunk-QDJLQR53.cjs.map +1 -0
  22. package/dist/chunk-S4WAZC2T.cjs +173 -0
  23. package/dist/chunk-S4WAZC2T.cjs.map +1 -0
  24. package/dist/chunk-SMH6IOP2.js +368 -0
  25. package/dist/chunk-SMH6IOP2.js.map +1 -0
  26. package/dist/chunk-SR3MPV4D.js +237 -0
  27. package/dist/chunk-SR3MPV4D.js.map +1 -0
  28. package/dist/{chunk-7RGG6ME7.cjs → chunk-TBW26OPP.cjs} +365 -688
  29. package/dist/chunk-TBW26OPP.cjs.map +1 -0
  30. package/dist/chunk-X2K3GIWE.js +235 -0
  31. package/dist/chunk-X2K3GIWE.js.map +1 -0
  32. package/dist/chunk-ZCUXHW55.cjs +242 -0
  33. package/dist/chunk-ZCUXHW55.cjs.map +1 -0
  34. package/dist/element-browser.js +799 -493
  35. package/dist/element-browser.js.map +1 -1
  36. package/dist/element.cjs +58 -4
  37. package/dist/element.cjs.map +1 -1
  38. package/dist/element.d.cts +38 -0
  39. package/dist/element.d.ts +38 -0
  40. package/dist/element.js +57 -3
  41. package/dist/element.js.map +1 -1
  42. package/dist/index.cjs +523 -393
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.js +494 -366
  45. package/dist/index.js.map +1 -1
  46. package/dist/libav-demux-H2GS46GH.cjs +27 -0
  47. package/dist/libav-demux-H2GS46GH.cjs.map +1 -0
  48. package/dist/libav-demux-OWZ4T2YW.js +6 -0
  49. package/dist/libav-demux-OWZ4T2YW.js.map +1 -0
  50. package/dist/{libav-import-GST2AMPL.cjs → libav-import-2ZVKV2E7.cjs} +2 -2
  51. package/dist/{libav-import-GST2AMPL.cjs.map → libav-import-2ZVKV2E7.cjs.map} +1 -1
  52. package/dist/{libav-import-2JURFHEW.js → libav-import-6MGLCXVQ.js} +2 -2
  53. package/dist/{libav-import-2JURFHEW.js.map → libav-import-6MGLCXVQ.js.map} +1 -1
  54. package/dist/player.cjs +601 -470
  55. package/dist/player.cjs.map +1 -1
  56. package/dist/player.d.cts +50 -0
  57. package/dist/player.d.ts +50 -0
  58. package/dist/player.js +580 -449
  59. package/dist/player.js.map +1 -1
  60. package/dist/remux-OBSMIENG.cjs +35 -0
  61. package/dist/remux-OBSMIENG.cjs.map +1 -0
  62. package/dist/remux-WBYIZBBX.js +10 -0
  63. package/dist/remux-WBYIZBBX.js.map +1 -0
  64. package/dist/source-4TZ6KMNV.js +4 -0
  65. package/dist/{source-F656KYYV.js.map → source-4TZ6KMNV.js.map} +1 -1
  66. package/dist/source-7YLO6E7X.cjs +29 -0
  67. package/dist/{source-73CAH6HW.cjs.map → source-7YLO6E7X.cjs.map} +1 -1
  68. package/dist/source-MTX5ELUZ.js +4 -0
  69. package/dist/{source-QJR3OHTW.js.map → source-MTX5ELUZ.js.map} +1 -1
  70. package/dist/source-VFLXLOCN.cjs +29 -0
  71. package/dist/{source-VB74JQ7Z.cjs.map → source-VFLXLOCN.cjs.map} +1 -1
  72. package/dist/subtitles-4T74JRGT.js +4 -0
  73. package/dist/subtitles-4T74JRGT.js.map +1 -0
  74. package/dist/subtitles-QUH4LPI4.cjs +29 -0
  75. package/dist/subtitles-QUH4LPI4.cjs.map +1 -0
  76. package/package.json +1 -1
  77. package/src/convert/remux.ts +1 -35
  78. package/src/convert/transcode-libav.ts +691 -0
  79. package/src/convert/transcode.ts +12 -4
  80. package/src/element/avbridge-player.ts +16 -0
  81. package/src/element/avbridge-video.ts +54 -0
  82. package/src/errors.ts +6 -0
  83. package/src/player.ts +15 -16
  84. package/src/strategies/fallback/decoder.ts +96 -173
  85. package/src/strategies/fallback/index.ts +19 -2
  86. package/src/strategies/fallback/libav-import.ts +9 -1
  87. package/src/strategies/fallback/video-renderer.ts +107 -0
  88. package/src/strategies/hybrid/decoder.ts +88 -180
  89. package/src/strategies/hybrid/index.ts +17 -2
  90. package/src/strategies/native.ts +6 -3
  91. package/src/strategies/remux/index.ts +14 -2
  92. package/src/strategies/remux/pipeline.ts +72 -12
  93. package/src/subtitles/render.ts +8 -0
  94. package/src/util/libav-demux.ts +405 -0
  95. package/dist/chunk-2PGRFCWB.js.map +0 -1
  96. package/dist/chunk-6UUT4BEA.cjs.map +0 -1
  97. package/dist/chunk-7RGG6ME7.cjs.map +0 -1
  98. package/dist/chunk-NV7ILLWH.js.map +0 -1
  99. package/dist/chunk-QQXBPW72.js.map +0 -1
  100. package/dist/chunk-XKPSTC34.cjs.map +0 -1
  101. package/dist/source-73CAH6HW.cjs +0 -28
  102. package/dist/source-F656KYYV.js +0 -3
  103. package/dist/source-QJR3OHTW.js +0 -3
  104. package/dist/source-VB74JQ7Z.cjs +0 -28
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/strategies/remux/annexb.ts","../src/convert/remux.ts","../src/convert/transcode.ts"],"names":["us","MEDIABUNNY_CONTAINERS","avbridgeVideoToMediabunny","avbridgeAudioToMediabunny"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * H.264/HEVC bitstream conversion helpers.\n *\n * Demuxers from MP4-family containers (mediabunny) hand us packets in **AVCC**\n * format: each NAL unit prefixed with a 4-byte big-endian length.\n *\n * Demuxers from elementary-stream/AVI/TS hand us **Annex B**: NAL units\n * separated by `00 00 00 01` (or `00 00 01`) start codes.\n *\n * MSE expects AVCC inside fragmented MP4. So when the source side emits Annex\n * B, we need to convert before muxing. Going the other way (AVCC → Annex B) is\n * useful for feeding `VideoDecoder` configured with `description` omitted.\n */\n\nconst START_CODE_4 = new Uint8Array([0, 0, 0, 1]);\n\n/** True if the bytes look like Annex B (start with `00 00 00 01` or `00 00 01`). */\nexport function isAnnexB(bytes: Uint8Array): boolean {\n if (bytes.length < 3) return false;\n if (bytes[0] === 0 && bytes[1] === 0 && bytes[2] === 1) return true;\n if (bytes.length >= 4 && bytes[0] === 0 && bytes[1] === 0 && bytes[2] === 0 && bytes[3] === 1) return true;\n return false;\n}\n\n/**\n * Walk an Annex B byte stream and yield each NAL unit (without start code).\n * This is the standard byte-by-byte scan; no SIMD tricks because the typical\n * frame is small.\n */\nexport function* iterateAnnexBNalus(bytes: Uint8Array): Generator<Uint8Array> {\n const length = bytes.length;\n let i = 0;\n let nalStart = -1;\n\n while (i < length) {\n // Look for start code at position i\n let scLen = 0;\n if (i + 3 < length && bytes[i] === 0 && bytes[i + 1] === 0 && bytes[i + 2] === 0 && bytes[i + 3] === 1) {\n scLen = 4;\n } else if (i + 2 < length && bytes[i] === 0 && bytes[i + 1] === 0 && bytes[i + 2] === 1) {\n scLen = 3;\n }\n\n if (scLen > 0) {\n if (nalStart >= 0) {\n yield bytes.subarray(nalStart, i);\n }\n nalStart = i + scLen;\n i += scLen;\n } else {\n i += 1;\n }\n }\n\n if (nalStart >= 0 && nalStart < length) {\n yield bytes.subarray(nalStart, length);\n }\n}\n\n/**\n * Convert an Annex B byte stream to AVCC. Each NALU is prefixed with its\n * 4-byte big-endian length.\n */\nexport function annexBToAvcc(annexB: Uint8Array): Uint8Array {\n const nalus: Uint8Array[] = [];\n let total = 0;\n for (const nal of iterateAnnexBNalus(annexB)) {\n nalus.push(nal);\n total += 4 + nal.length;\n }\n const out = new Uint8Array(total);\n let off = 0;\n for (const nal of nalus) {\n const len = nal.length;\n out[off++] = (len >>> 24) & 0xff;\n out[off++] = (len >>> 16) & 0xff;\n out[off++] = (len >>> 8) & 0xff;\n out[off++] = len & 0xff;\n out.set(nal, off);\n off += len;\n }\n return out;\n}\n\n/**\n * Convert AVCC (4-byte length-prefixed) NALUs to Annex B. Each NALU is\n * prefixed with `00 00 00 01`.\n */\nexport function avccToAnnexB(avcc: Uint8Array): Uint8Array {\n const out: Uint8Array[] = [];\n let total = 0;\n let i = 0;\n while (i + 4 <= avcc.length) {\n const len =\n (avcc[i] << 24) | (avcc[i + 1] << 16) | (avcc[i + 2] << 8) | avcc[i + 3];\n i += 4;\n if (i + len > avcc.length) {\n throw new Error(`avccToAnnexB: NAL length ${len} overflows buffer at offset ${i}`);\n }\n out.push(START_CODE_4);\n out.push(avcc.subarray(i, i + len));\n total += 4 + len;\n i += len;\n }\n const merged = new Uint8Array(total);\n let off = 0;\n for (const chunk of out) {\n merged.set(chunk, off);\n off += chunk.length;\n }\n return merged;\n}\n","/**\n * Standalone remux function: repackage media into a modern container without\n * re-encoding. Input can be any format avbridge can probe; output is a\n * finalized downloadable file (MP4, WebM, or MKV).\n *\n * Two internal paths:\n * - **Path A** (mediabunny-readable containers): wraps mediabunny's Conversion\n * class for MP4/MKV/WebM/OGG/MOV/WAV/MP3/FLAC/ADTS sources.\n * - **Path B** (AVI/ASF/FLV): libav.js demux + mediabunny mux via manual\n * packet pump. Lazy-loads libav.js — zero cost if unused.\n */\n\nimport { probe } from \"../probe/index.js\";\nimport { isAnnexB, annexBToAvcc } from \"../strategies/remux/annexb.js\";\nimport {\n avbridgeVideoToMediabunny,\n avbridgeAudioToMediabunny,\n buildMediabunnySourceFromInput,\n} from \"../probe/mediabunny.js\";\nimport { normalizeSource } from \"../util/source.js\";\nimport { prepareLibavInput, type LibavInputHandle } from \"../util/libav-http-reader.js\";\nimport type {\n MediaInput,\n MediaContext,\n ConvertOptions,\n ConvertResult,\n OutputFormat,\n} from \"../types.js\";\n\n/** Containers mediabunny can read (and therefore use Conversion for). */\nconst MEDIABUNNY_CONTAINERS = new Set([\n \"mp4\", \"mov\", \"mkv\", \"webm\", \"ogg\", \"wav\", \"mp3\", \"flac\", \"adts\",\n]);\n\n/**\n * Remux a media source into a modern container format without re-encoding.\n *\n * @throws When the source codecs cannot be remuxed (e.g. WMV3 — use `transcode()` instead).\n * @throws When an AVI/ASF/FLV source is provided but libav.js is not installed.\n */\nexport async function remux(\n source: MediaInput,\n options: ConvertOptions = {},\n): Promise<ConvertResult> {\n const outputFormat = options.outputFormat ?? \"mp4\";\n options.signal?.throwIfAborted();\n\n // Probe the source\n const ctx = await probe(source);\n options.signal?.throwIfAborted();\n\n // Validate remux eligibility: all codecs must map to mediabunny output codecs\n validateRemuxEligibility(ctx, options.strict ?? false);\n\n // Route to the appropriate path\n if (MEDIABUNNY_CONTAINERS.has(ctx.container)) {\n return remuxViaMediAbunny(ctx, outputFormat, options);\n }\n return remuxViaLibav(ctx, outputFormat, options);\n}\n\n// ── Eligibility validation ──────────────────────────────────────────────────\n\n/** @internal Exported for testing. */\nexport function validateRemuxEligibility(ctx: MediaContext, strict: boolean): void {\n const video = ctx.videoTracks[0];\n const audio = ctx.audioTracks[0];\n\n if (video) {\n const mbCodec = avbridgeVideoToMediabunny(video.codec);\n if (!mbCodec) {\n throw new Error(\n `Cannot remux: video codec \"${video.codec}\" is not supported for remuxing. ` +\n `Use transcode() to re-encode to a modern codec.`,\n );\n }\n }\n\n if (audio) {\n const mbCodec = avbridgeAudioToMediabunny(audio.codec);\n if (!mbCodec) {\n throw new Error(\n `Cannot remux: audio codec \"${audio.codec}\" is not supported for remuxing. ` +\n `Use transcode() to re-encode to a modern codec.`,\n );\n }\n }\n\n if (strict && video?.codec === \"h264\" && audio?.codec === \"mp3\") {\n throw new Error(\n `Cannot remux in strict mode: H.264 + MP3 is a best-effort combination ` +\n `that may produce playback issues in some browsers. ` +\n `Set strict: false to allow, or use transcode() to re-encode audio to AAC.`,\n );\n }\n\n if (!video && !audio) {\n throw new Error(\"Cannot remux: source has no video or audio tracks.\");\n }\n}\n\n// ── Path A: mediabunny Conversion ───────────────────────────────────────────\n\nasync function remuxViaMediAbunny(\n ctx: MediaContext,\n outputFormat: OutputFormat,\n options: ConvertOptions,\n): Promise<ConvertResult> {\n const mb = await import(\"mediabunny\");\n\n const input = new mb.Input({\n source: await buildMediabunnySourceFromInput(mb, ctx.source),\n formats: mb.ALL_FORMATS,\n });\n\n const target = new mb.BufferTarget();\n const output = new mb.Output({\n format: createOutputFormat(mb, outputFormat),\n target,\n });\n\n const conversion = await mb.Conversion.init({\n input,\n output,\n showWarnings: false,\n });\n\n if (!conversion.isValid) {\n const reasons = conversion.discardedTracks\n .map((d) => `${d.track.type} track discarded: ${d.reason}`)\n .join(\"; \");\n throw new Error(`Cannot remux: mediabunny rejected the conversion. ${reasons}`);\n }\n\n // Wire progress\n if (options.onProgress) {\n const onProgress = options.onProgress;\n conversion.onProgress = (p) => {\n onProgress({ percent: p * 100, bytesWritten: 0 });\n };\n }\n\n // Wire cancellation\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n options.signal.throwIfAborted();\n abortHandler = () => void conversion.cancel();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n try {\n await conversion.execute();\n } finally {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n }\n\n if (!target.buffer) {\n throw new Error(\"Remux failed: mediabunny produced no output buffer.\");\n }\n\n const mimeType = mimeForFormat(outputFormat);\n const blob = new Blob([target.buffer], { type: mimeType });\n const filename = generateFilename(ctx.name, outputFormat);\n\n options.onProgress?.({ percent: 100, bytesWritten: blob.size });\n\n return {\n blob,\n mimeType,\n container: outputFormat,\n videoCodec: ctx.videoTracks[0]?.codec,\n audioCodec: ctx.audioTracks[0]?.codec,\n duration: ctx.duration,\n filename,\n };\n}\n\n// ── Path B: libav.js demux + mediabunny mux (AVI/ASF/FLV) ──────────────────\n\nasync function remuxViaLibav(\n ctx: MediaContext,\n outputFormat: OutputFormat,\n options: ConvertOptions,\n): Promise<ConvertResult> {\n // Lazy-load libav\n let loadLibav: typeof import(\"../strategies/fallback/libav-loader.js\").loadLibav;\n let pickLibavVariant: typeof import(\"../strategies/fallback/variant-routing.js\").pickLibavVariant;\n try {\n const loader = await import(\"../strategies/fallback/libav-loader.js\");\n const routing = await import(\"../strategies/fallback/variant-routing.js\");\n loadLibav = loader.loadLibav;\n pickLibavVariant = routing.pickLibavVariant;\n } catch {\n throw new Error(\n `Cannot remux ${ctx.container.toUpperCase()} source: libav.js is not available. ` +\n `Install @libav.js/variant-webcodecs and libavjs-webcodecs-bridge, ` +\n `or build the custom avbridge variant with scripts/build-libav.sh.`,\n );\n }\n\n const variant = pickLibavVariant(ctx);\n const libav = await loadLibav(variant) as unknown as LibavRuntime;\n\n // For Blob/File inputs, libav reads from an in-memory readahead file.\n // For URL inputs, libav demuxes via HTTP Range requests through the\n // block reader — no full download.\n const normalized = await normalizeSource(ctx.source);\n const filename = ctx.name ?? `remux-input-${Date.now()}`;\n const handle: LibavInputHandle = await prepareLibavInput(libav as unknown as Parameters<typeof prepareLibavInput>[0], filename, normalized);\n\n try {\n return await doLibavRemux(libav, filename, ctx, outputFormat, options);\n } finally {\n await handle.detach().catch(() => {});\n }\n}\n\nasync function doLibavRemux(\n libav: LibavRuntime,\n filename: string,\n ctx: MediaContext,\n outputFormat: OutputFormat,\n options: ConvertOptions,\n): Promise<ConvertResult> {\n const mb = await import(\"mediabunny\");\n\n const readPkt = await libav.av_packet_alloc();\n const [fmt_ctx, streams] = await libav.ff_init_demuxer_file(filename);\n const videoStream = streams.find((s) => s.codec_type === libav.AVMEDIA_TYPE_VIDEO) ?? null;\n const audioStream = streams.find((s) => s.codec_type === libav.AVMEDIA_TYPE_AUDIO) ?? null;\n\n // Map codecs to mediabunny output\n const videoTrackInfo = ctx.videoTracks[0];\n const audioTrackInfo = ctx.audioTracks[0];\n const mbVideoCodec = videoTrackInfo ? avbridgeVideoToMediabunny(videoTrackInfo.codec) : null;\n const mbAudioCodec = audioTrackInfo ? avbridgeAudioToMediabunny(audioTrackInfo.codec) : null;\n\n // Set up mediabunny output with BufferTarget\n const target = new mb.BufferTarget();\n const output = new mb.Output({\n format: createOutputFormat(mb, outputFormat),\n target,\n });\n\n let videoSource: InstanceType<typeof mb.EncodedVideoPacketSource> | null = null;\n let audioSource: InstanceType<typeof mb.EncodedAudioPacketSource> | null = null;\n\n if (mbVideoCodec && videoStream) {\n videoSource = new mb.EncodedVideoPacketSource(mbVideoCodec);\n output.addVideoTrack(videoSource);\n }\n if (mbAudioCodec && audioStream) {\n type AudioCodecArg = ConstructorParameters<typeof mb.EncodedAudioPacketSource>[0];\n audioSource = new mb.EncodedAudioPacketSource(mbAudioCodec as AudioCodecArg);\n output.addAudioTrack(audioSource);\n }\n\n await output.start();\n\n // Timestamp tracking for synthetic timestamps\n const videoFps = videoTrackInfo?.fps && videoTrackInfo.fps > 0 ? videoTrackInfo.fps : 30;\n const videoFrameStepUs = Math.max(1, Math.round(1_000_000 / videoFps));\n let syntheticVideoUs = 0;\n let syntheticAudioUs = 0;\n\n const videoTimeBase: [number, number] | undefined =\n videoStream?.time_base_num && videoStream?.time_base_den\n ? [videoStream.time_base_num, videoStream.time_base_den]\n : undefined;\n const audioTimeBase: [number, number] | undefined =\n audioStream?.time_base_num && audioStream?.time_base_den\n ? [audioStream.time_base_num, audioStream.time_base_den]\n : undefined;\n\n let totalPackets = 0;\n const durationUs = ctx.duration ? ctx.duration * 1_000_000 : 0;\n let firstVideoMeta = true;\n let firstAudioMeta = true;\n\n // Pump loop: read packets from libav, feed to mediabunny output\n while (true) {\n options.signal?.throwIfAborted();\n\n let readErr: number;\n let packets: Record<number, LibavPacket[]>;\n try {\n [readErr, packets] = await libav.ff_read_frame_multi(fmt_ctx, readPkt, {\n limit: 64 * 1024,\n });\n } catch (err) {\n throw new Error(`libav demux failed: ${(err as Error).message}`);\n }\n\n const videoPackets = videoStream ? packets[videoStream.index] ?? [] : [];\n const audioPackets = audioStream ? packets[audioStream.index] ?? [] : [];\n\n // Feed video packets\n if (videoSource) {\n for (const pkt of videoPackets) {\n sanitizePacketTimestamp(pkt, () => {\n const ts = syntheticVideoUs;\n syntheticVideoUs += videoFrameStepUs;\n return ts;\n }, videoTimeBase);\n\n // libav demuxes AVI/ASF/FLV H.264 as Annex B (start-code framed),\n // but mediabunny's fMP4 muxer expects AVCC (length-prefixed). Convert\n // on the fly. The check is cheap: isAnnexB reads 4 bytes at the head.\n if (videoTrackInfo && (videoTrackInfo.codec === \"h264\" || videoTrackInfo.codec === \"h265\") && isAnnexB(pkt.data)) {\n pkt.data = annexBToAvcc(pkt.data);\n }\n\n const mbPacket = libavPacketToMediAbunny(mb, pkt);\n await videoSource.add(\n mbPacket,\n firstVideoMeta ? { decoderConfig: buildVideoDecoderConfig(videoTrackInfo!) } : undefined,\n );\n firstVideoMeta = false;\n }\n }\n\n // Feed audio packets\n if (audioSource) {\n for (const pkt of audioPackets) {\n sanitizePacketTimestamp(pkt, () => {\n const ts = syntheticAudioUs;\n const sampleRate = audioTrackInfo?.sampleRate ?? 44100;\n syntheticAudioUs += Math.round(1024 * 1_000_000 / sampleRate);\n return ts;\n }, audioTimeBase);\n\n const mbPacket = libavPacketToMediAbunny(mb, pkt);\n await audioSource.add(\n mbPacket,\n firstAudioMeta ? { decoderConfig: buildAudioDecoderConfig(audioTrackInfo!) } : undefined,\n );\n firstAudioMeta = false;\n }\n }\n\n totalPackets += videoPackets.length + audioPackets.length;\n\n // Report progress\n if (options.onProgress && durationUs > 0) {\n const lastVideoTs = videoPackets.length > 0 ? videoPackets[videoPackets.length - 1].pts ?? 0 : 0;\n const lastAudioTs = audioPackets.length > 0 ? audioPackets[audioPackets.length - 1].pts ?? 0 : 0;\n const currentUs = Math.max(lastVideoTs, lastAudioTs);\n const percent = Math.min(99, (currentUs / durationUs) * 100);\n options.onProgress({ percent, bytesWritten: 0 });\n }\n\n if (readErr === libav.AVERROR_EOF) break;\n if (readErr && readErr !== 0 && readErr !== -libav.EAGAIN) {\n console.warn(\"[avbridge] remux: ff_read_frame_multi returned\", readErr);\n break;\n }\n }\n\n await output.finalize();\n\n // Cleanup libav resources\n try { await libav.av_packet_free?.(readPkt); } catch { /* ignore */ }\n try { await libav.avformat_close_input_js(fmt_ctx); } catch { /* ignore */ }\n\n if (!target.buffer) {\n throw new Error(\"Remux failed: mediabunny produced no output buffer.\");\n }\n\n const mimeType = mimeForFormat(outputFormat);\n const blob = new Blob([target.buffer], { type: mimeType });\n const outputFilename = generateFilename(ctx.name, outputFormat);\n\n options.onProgress?.({ percent: 100, bytesWritten: blob.size });\n\n return {\n blob,\n mimeType,\n container: outputFormat,\n videoCodec: videoTrackInfo?.codec,\n audioCodec: audioTrackInfo?.codec,\n duration: ctx.duration,\n filename: outputFilename,\n };\n}\n\n// ── Packet timestamp sanitizer (from hybrid/decoder.ts) ─────────────────────\n\nfunction sanitizePacketTimestamp(\n pkt: LibavPacket,\n nextUs: () => number,\n fallbackTimeBase?: [number, number],\n): void {\n const lo = pkt.pts ?? 0;\n const hi = pkt.ptshi ?? 0;\n const isInvalid = (hi === -2147483648 && lo === 0) || !Number.isFinite(lo);\n if (isInvalid) {\n const us = nextUs();\n pkt.pts = us;\n pkt.ptshi = 0;\n pkt.time_base_num = 1;\n pkt.time_base_den = 1_000_000;\n return;\n }\n const tb = fallbackTimeBase ?? [1, 1_000_000];\n const pts64 = hi * 0x100000000 + lo;\n const us = Math.round((pts64 * 1_000_000 * tb[0]) / tb[1]);\n if (Number.isFinite(us) && Math.abs(us) <= Number.MAX_SAFE_INTEGER) {\n pkt.pts = us;\n pkt.ptshi = us < 0 ? -1 : 0;\n pkt.time_base_num = 1;\n pkt.time_base_den = 1_000_000;\n return;\n }\n const fallback = nextUs();\n pkt.pts = fallback;\n pkt.ptshi = 0;\n pkt.time_base_num = 1;\n pkt.time_base_den = 1_000_000;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** @internal Exported for use by transcode(). */\nexport function createOutputFormat(\n mb: typeof import(\"mediabunny\"),\n format: OutputFormat,\n) {\n switch (format) {\n case \"mp4\": return new mb.Mp4OutputFormat({ fastStart: \"in-memory\" });\n case \"webm\": return new mb.WebMOutputFormat();\n case \"mkv\": return new mb.MkvOutputFormat();\n default: return new mb.Mp4OutputFormat({ fastStart: \"in-memory\" });\n }\n}\n\n/** @internal Exported for testing. */\nexport function mimeForFormat(format: OutputFormat): string {\n switch (format) {\n case \"mp4\": return \"video/mp4\";\n case \"webm\": return \"video/webm\";\n case \"mkv\": return \"video/x-matroska\";\n default: return \"application/octet-stream\";\n }\n}\n\n/** @internal Exported for testing. */\nexport function generateFilename(originalName: string | undefined, format: OutputFormat): string {\n const ext = format === \"mkv\" ? \"mkv\" : format;\n if (!originalName) return `output.${ext}`;\n const base = originalName.replace(/\\.[^.]+$/, \"\");\n return `${base}.${ext}`;\n}\n\n/** Sequence counter for decode-order numbering in mediabunny packets. */\nlet _seqCounter = 0;\n\n/**\n * Convert a libav packet to a mediabunny EncodedPacket.\n * Timestamps from libav are in microseconds (after sanitization); mediabunny wants seconds.\n */\nfunction libavPacketToMediAbunny(\n mb: typeof import(\"mediabunny\"),\n pkt: LibavPacket,\n): InstanceType<typeof mb.EncodedPacket> {\n const KEY_FRAME_FLAG = 0x0001;\n const timestampSec = (pkt.pts ?? 0) / 1_000_000;\n const durationSec = (pkt.duration ?? 0) / 1_000_000;\n const type = (pkt.flags & KEY_FRAME_FLAG) ? \"key\" as const : \"delta\" as const;\n return new mb.EncodedPacket(pkt.data, type, timestampSec, durationSec, _seqCounter++);\n}\n\nfunction buildVideoDecoderConfig(track: { codec: string; width: number; height: number; codecString?: string }) {\n return {\n codec: track.codecString ?? track.codec,\n codedWidth: track.width,\n codedHeight: track.height,\n };\n}\n\nfunction buildAudioDecoderConfig(track: { codec: string; channels: number; sampleRate: number; codecString?: string }) {\n return {\n codec: track.codecString ?? track.codec,\n numberOfChannels: track.channels,\n sampleRate: track.sampleRate,\n };\n}\n\n// ── Structural types ────────────────────────────────────────────────────────\n\ninterface LibavPacket {\n data: Uint8Array;\n pts: number;\n ptshi?: number;\n duration?: number;\n durationhi?: number;\n flags: number;\n stream_index: number;\n time_base_num?: number;\n time_base_den?: number;\n}\n\ninterface LibavStream {\n index: number;\n codec_type: number;\n codec_id: number;\n codecpar: number;\n time_base_num?: number;\n time_base_den?: number;\n}\n\ninterface LibavRuntime {\n AVMEDIA_TYPE_VIDEO: number;\n AVMEDIA_TYPE_AUDIO: number;\n AVERROR_EOF: number;\n EAGAIN: number;\n\n mkreadaheadfile(name: string, blob: Blob): Promise<void>;\n unlinkreadaheadfile(name: string): Promise<void>;\n ff_init_demuxer_file(name: string): Promise<[number, LibavStream[]]>;\n ff_read_frame_multi(\n fmt_ctx: number,\n pkt: number,\n opts?: { limit?: number },\n ): Promise<[number, Record<number, LibavPacket[]>]>;\n av_packet_alloc(): Promise<number>;\n av_packet_free?(pkt: number): Promise<void>;\n avformat_close_input_js(ctx: number): Promise<void>;\n}\n","/**\n * Standalone transcode function: re-encode media into a modern container with\n * modern codecs. Unlike {@link remux}, this is a lossy operation that decodes\n * and re-encodes the streams.\n *\n * Built on top of mediabunny's `Conversion` class which handles the full\n * decode → encode → mux pipeline. WebCodecs encoders are used when available;\n * mediabunny falls back to other paths internally.\n *\n * Limitations in v1:\n * - Input must be in a mediabunny-readable container (MP4, MKV, WebM, OGG, ...).\n * AVI/ASF/FLV sources are not yet supported by transcode (use remux + native\n * playback or wait for v1.1).\n */\n\nimport { probe } from \"../probe/index.js\";\nimport { buildMediabunnySourceFromInput } from \"../probe/mediabunny.js\";\nimport { createOutputFormat, mimeForFormat, generateFilename } from \"./remux.js\";\nimport type {\n MediaInput,\n MediaContext,\n TranscodeOptions,\n ConvertResult,\n OutputFormat,\n OutputVideoCodec,\n OutputAudioCodec,\n TranscodeQuality,\n} from \"../types.js\";\n\n/** Containers mediabunny can demux. AVI/ASF/FLV are not in this set. */\nconst MEDIABUNNY_CONTAINERS = new Set([\n \"mp4\", \"mov\", \"mkv\", \"webm\", \"ogg\", \"wav\", \"mp3\", \"flac\", \"adts\",\n]);\n\n/**\n * Transcode a media source into a modern container with modern codecs.\n *\n * Re-encodes both video and audio. Use {@link remux} instead when the source\n * codecs are already modern and only the container needs changing — it's much\n * faster and lossless.\n */\nexport async function transcode(\n source: MediaInput,\n options: TranscodeOptions = {},\n): Promise<ConvertResult> {\n const outputFormat: OutputFormat = options.outputFormat ?? \"mp4\";\n const videoCodec = options.videoCodec ?? defaultVideoCodec(outputFormat);\n const audioCodec = options.audioCodec ?? defaultAudioCodec(outputFormat);\n const quality = options.quality ?? \"medium\";\n\n validateCodecCompatibility(outputFormat, videoCodec, audioCodec);\n options.signal?.throwIfAborted();\n\n const ctx = await probe(source);\n options.signal?.throwIfAborted();\n\n if (!MEDIABUNNY_CONTAINERS.has(ctx.container)) {\n throw new Error(\n `Cannot transcode \"${ctx.container}\" sources in v1. ` +\n `transcode() only supports inputs that mediabunny can read (MP4, MKV, WebM, OGG, MP3, FLAC, WAV, MOV). ` +\n `For AVI/ASF/FLV sources, use the player's playback strategies instead.`,\n );\n }\n\n return doTranscode(ctx, outputFormat, videoCodec, audioCodec, quality, options);\n}\n\n/**\n * One attempt at the full mediabunny conversion. Each attempt allocates\n * fresh `Input` / `Output` / `Conversion` instances because they are all\n * single-use in mediabunny.\n *\n * Returns the muxed `ArrayBuffer` on success. Throws on failure.\n */\nasync function attemptTranscode(\n ctx: MediaContext,\n outputFormat: OutputFormat,\n videoCodec: OutputVideoCodec,\n audioCodec: OutputAudioCodec,\n quality: TranscodeQuality,\n options: TranscodeOptions,\n): Promise<ArrayBuffer | null> {\n const mb = await import(\"mediabunny\");\n\n const input = new mb.Input({\n source: await buildMediabunnySourceFromInput(mb, ctx.source),\n formats: mb.ALL_FORMATS,\n });\n\n // When outputStream is provided, pipe chunks directly to the stream\n // instead of accumulating into a buffer. This keeps memory usage flat\n // regardless of file size.\n let bytesWritten = 0;\n const useStream = !!options.outputStream;\n const bufferTarget = useStream ? null : new mb.BufferTarget();\n const streamTarget = useStream\n ? new mb.StreamTarget(new WritableStream({\n write(chunk: { type: string; data: Uint8Array; position: number }) {\n bytesWritten += chunk.data.byteLength;\n const writer = options.outputStream!.getWriter();\n return writer.write(chunk.data).then(() => writer.releaseLock());\n },\n }))\n : null;\n\n const output = new mb.Output({\n format: createOutputFormat(mb, outputFormat),\n target: (streamTarget ?? bufferTarget)!,\n });\n\n // Build mediabunny ConversionVideoOptions\n const videoOptions = options.dropVideo\n ? { discard: true as const }\n : {\n codec: avbridgeVideoToMediabunny(videoCodec),\n bitrate: options.videoBitrate ?? qualityToMediabunny(mb, quality),\n forceTranscode: true,\n ...(options.width !== undefined ? { width: options.width } : {}),\n ...(options.height !== undefined ? { height: options.height } : {}),\n ...(options.width !== undefined && options.height !== undefined\n ? { fit: \"contain\" as const }\n : {}),\n ...(options.frameRate !== undefined ? { frameRate: options.frameRate } : {}),\n ...(options.hardwareAcceleration !== undefined\n ? { hardwareAcceleration: options.hardwareAcceleration }\n : {}),\n };\n\n const audioOptions = options.dropAudio\n ? { discard: true as const }\n : {\n codec: avbridgeAudioToMediabunny(audioCodec),\n bitrate: options.audioBitrate ?? qualityToMediabunny(mb, quality),\n forceTranscode: true,\n };\n\n const conversion = await mb.Conversion.init({\n input,\n output,\n video: videoOptions,\n audio: audioOptions,\n showWarnings: false,\n });\n\n if (!conversion.isValid) {\n const reasons = conversion.discardedTracks\n .map((d) => `${d.track.type} track discarded: ${d.reason}`)\n .join(\"; \");\n throw new Error(\n `Cannot transcode: mediabunny rejected the conversion. ${reasons || \"(no reason given)\"}`,\n );\n }\n\n // Wire progress\n if (options.onProgress) {\n const onProgress = options.onProgress;\n conversion.onProgress = (p) => {\n onProgress({ percent: p * 100, bytesWritten: 0 });\n };\n }\n\n // Wire cancellation\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n options.signal.throwIfAborted();\n abortHandler = () => void conversion.cancel();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n try {\n await conversion.execute();\n } finally {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n }\n\n if (useStream) {\n return null; // data already written to outputStream\n }\n if (!bufferTarget!.buffer) {\n throw new Error(\"Transcode failed: mediabunny produced no output buffer.\");\n }\n return bufferTarget!.buffer;\n}\n\n/**\n * Detect the \"Encoding error\" failure pattern that headless Chromium's\n * H.264 WebCodecs encoder hits on its first call per page. The encoder\n * is fully usable on the second attempt, so we retry once.\n *\n * See <https://issues.chromium.org/> — this is a known first-call init\n * issue in the OS-backed encoder pipeline (VideoToolbox on macOS).\n */\nfunction isLikelyEncoderInitError(err: unknown): boolean {\n if (!err) return false;\n const msg = err instanceof Error ? err.message : String(err);\n const lower = msg.toLowerCase();\n // The exact strings WebCodecs / mediabunny surface for encoder failures.\n return (\n lower.includes(\"encoding error\") ||\n lower.includes(\"encoder\") ||\n lower.includes(\"encode failed\")\n );\n}\n\nfunction describeError(err: unknown): string {\n if (!err) return \"(unknown)\";\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n/**\n * Maximum encoder retry attempts. Headless Chromium's H.264 WebCodecs\n * encoder hits a first-call init failure and *usually* recovers on the\n * second attempt — but in rare cases the second attempt also fails. Two\n * extra attempts (3 total) is enough to make the smoke test reliable\n * without masking real bugs.\n */\nconst MAX_ENCODER_RETRIES = 2;\n\nasync function doTranscode(\n ctx: MediaContext,\n outputFormat: OutputFormat,\n videoCodec: OutputVideoCodec,\n audioCodec: OutputAudioCodec,\n quality: TranscodeQuality,\n options: TranscodeOptions,\n): Promise<ConvertResult> {\n const notes: string[] = [];\n let buffer: ArrayBuffer | null = null;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= MAX_ENCODER_RETRIES; attempt++) {\n try {\n buffer = await attemptTranscode(ctx, outputFormat, videoCodec, audioCodec, quality, options);\n if (attempt > 0) {\n notes.push(\n `Encoder failed ${attempt} time${attempt === 1 ? \"\" : \"s\"} before succeeding ` +\n `(known headless Chromium WebCodecs encoder init issue): ${describeError(lastError)}`,\n );\n }\n break;\n } catch (err) {\n lastError = err;\n // Don't retry on user cancellation or permanent setup errors.\n if (options.signal?.aborted) throw err;\n if (!isLikelyEncoderInitError(err)) throw err;\n if (attempt === MAX_ENCODER_RETRIES) throw err;\n // Small backoff between attempts.\n await new Promise((r) => setTimeout(r, 50 * (attempt + 1)));\n }\n }\n\n const mimeType = mimeForFormat(outputFormat);\n const filename = generateFilename(ctx.name, outputFormat);\n\n if (options.outputStream) {\n // Streaming mode — data already written to the stream. Return empty blob.\n options.onProgress?.({ percent: 100, bytesWritten: 0 });\n return {\n blob: new Blob([], { type: mimeType }),\n mimeType,\n container: outputFormat,\n videoCodec: options.dropVideo ? undefined : videoCodec,\n audioCodec: options.dropAudio ? undefined : audioCodec,\n duration: ctx.duration,\n filename,\n ...(notes.length > 0 ? { notes } : {}),\n };\n }\n\n if (!buffer) {\n throw new Error(\"Transcode failed: no buffer produced (this should be unreachable).\");\n }\n\n const blob = new Blob([buffer], { type: mimeType });\n options.onProgress?.({ percent: 100, bytesWritten: blob.size });\n\n return {\n blob,\n mimeType,\n container: outputFormat,\n videoCodec: options.dropVideo ? undefined : videoCodec,\n audioCodec: options.dropAudio ? undefined : audioCodec,\n duration: ctx.duration,\n filename,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** @internal Exported for testing. */\nexport function defaultVideoCodec(format: OutputFormat): OutputVideoCodec {\n switch (format) {\n case \"webm\": return \"vp9\";\n case \"mp4\":\n case \"mkv\":\n default: return \"h264\";\n }\n}\n\n/** @internal Exported for testing. */\nexport function defaultAudioCodec(format: OutputFormat): OutputAudioCodec {\n switch (format) {\n case \"webm\": return \"opus\";\n case \"mp4\":\n case \"mkv\":\n default: return \"aac\";\n }\n}\n\n/** @internal Exported for testing. */\nexport function validateCodecCompatibility(\n format: OutputFormat,\n videoCodec: OutputVideoCodec,\n audioCodec: OutputAudioCodec,\n): void {\n // WebM only allows VP8/VP9/AV1 video and Opus/Vorbis audio.\n if (format === \"webm\") {\n if (videoCodec !== \"vp9\" && videoCodec !== \"av1\") {\n throw new Error(\n `WebM does not support video codec \"${videoCodec}\". Use \"vp9\" or \"av1\", or change outputFormat to \"mp4\" or \"mkv\".`,\n );\n }\n if (audioCodec !== \"opus\") {\n throw new Error(\n `WebM does not support audio codec \"${audioCodec}\". Use \"opus\", or change outputFormat to \"mp4\" or \"mkv\".`,\n );\n }\n }\n}\n\nfunction avbridgeVideoToMediabunny(c: OutputVideoCodec): \"avc\" | \"hevc\" | \"vp9\" | \"av1\" {\n switch (c) {\n case \"h264\": return \"avc\";\n case \"h265\": return \"hevc\";\n case \"vp9\": return \"vp9\";\n case \"av1\": return \"av1\";\n }\n}\n\nfunction avbridgeAudioToMediabunny(c: OutputAudioCodec): \"aac\" | \"opus\" | \"flac\" {\n switch (c) {\n case \"aac\": return \"aac\";\n case \"opus\": return \"opus\";\n case \"flac\": return \"flac\";\n }\n}\n\nfunction qualityToMediabunny(\n mb: typeof import(\"mediabunny\"),\n quality: TranscodeQuality,\n): InstanceType<typeof mb.Quality> {\n switch (quality) {\n case \"low\": return mb.QUALITY_LOW;\n case \"medium\": return mb.QUALITY_MEDIUM;\n case \"high\": return mb.QUALITY_HIGH;\n case \"very-high\": return mb.QUALITY_VERY_HIGH;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/convert/transcode-libav.ts","../src/convert/transcode.ts"],"names":["createOutputFormat","mimeForFormat","generateFilename","throwIfAborted","throwIfDrainError","avbridgeVideoToMediabunny","qualityToMediabunny","avbridgeAudioToMediabunny"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Legacy-container transcode pipeline.\n *\n * One-pass: libav demux → WebCodecs VideoDecoder (or libav software video\n * decode for rv40/etc.) + libav software audio decode → VideoSample /\n * AudioSample → mediabunny Output → MP4 / WebM / MKV Blob.\n *\n * Reached from src/convert/transcode.ts when the input container is one of\n * {avi, asf, flv, rm/rmvb} (see isLibavTranscodeContainer). MP4/MKV/WebM/etc.\n * sources still go through the mediabunny Conversion path in transcode.ts.\n *\n * Scope limits (see docs/dev/ROADMAP.md):\n * - Single video + single audio track. Extra tracks are silently dropped.\n * - 8-bit video only; 10-bit throws with a clear error.\n * - No seek. Linear read-to-EOF.\n * - `outputStream` (streaming output to a WritableStream) is not yet\n * wired for this path — throws with a clear error if requested.\n */\n\n// Lazy imports: libav-demux + the libav-loader chain it pulls in are heavy.\n// To keep the `transcode` bundle scenario below its gzip budget, we only\n// load them when the libav path is actually taken. See the top of\n// transcodeViaLibav() for the dynamic imports.\nimport type { LibavPacket } from \"../util/libav-demux.js\";\nimport {\n AvbridgeError,\n ERR_TRANSCODE_ABORTED,\n ERR_TRANSCODE_UNSUPPORTED_COMBO,\n ERR_TRANSCODE_DECODE,\n ERR_CODEC_NOT_SUPPORTED,\n} from \"../errors.js\";\nimport type {\n MediaContext,\n TranscodeOptions,\n ConvertResult,\n OutputVideoCodec,\n OutputAudioCodec,\n TranscodeQuality,\n} from \"../types.js\";\n\n/** @internal */\nexport function isLibavTranscodeContainer(container: string): boolean {\n return (\n container === \"avi\" ||\n container === \"asf\" ||\n container === \"flv\" ||\n container === \"rm\" // RealMedia (.rm / .rmvb) — rv40/cook via libav software decode\n );\n}\n\nexport async function transcodeViaLibav(\n ctx: MediaContext,\n options: TranscodeOptions,\n): Promise<ConvertResult> {\n const outputFormat = options.outputFormat ?? \"mp4\";\n // Output format gate: mp4, webm, and mkv are supported. The shared\n // createOutputFormat helper in remux.ts handles the muxer side.\n if (outputFormat !== \"mp4\" && outputFormat !== \"webm\" && outputFormat !== \"mkv\") {\n throw new AvbridgeError(\n ERR_TRANSCODE_UNSUPPORTED_COMBO,\n `legacy-container transcode supports MP4, WebM, and MKV output (got \"${outputFormat}\").`,\n `Use outputFormat: \"mp4\", \"webm\", or \"mkv\".`,\n );\n }\n // Codec defaults depend on output format. `transcode()` already calls\n // validateCodecCompatibility with the user-supplied codecs, but when\n // we're reached directly or with just outputFormat set, pick sensible\n // defaults per container.\n const videoCodec: OutputVideoCodec =\n options.videoCodec ?? (outputFormat === \"webm\" ? \"vp9\" : \"h264\");\n const audioCodec: OutputAudioCodec =\n options.audioCodec ?? (outputFormat === \"webm\" ? \"opus\" : \"aac\");\n const quality: TranscodeQuality = options.quality ?? \"medium\";\n options.signal?.throwIfAborted();\n\n // Everything from here is lazily loaded so the `transcode` scenario\n // doesn't pay for libav/mediabunny weight just because this file is\n // on the import graph.\n const [\n mb,\n { openLibavDemux, sanitizePacketTimestamp, sanitizeFrameTimestamp, libavFrameToInterleavedFloat32 },\n { normalizeSource },\n { createOutputFormat, mimeForFormat, generateFilename },\n ] = await Promise.all([\n import(\"mediabunny\"),\n import(\"../util/libav-demux.js\"),\n import(\"../util/source.js\"),\n import(\"./remux.js\"),\n ]);\n\n // ── Open the demux session ──────────────────────────────────────────\n const normalized = await normalizeSource(ctx.source);\n const demux = await openLibavDemux({\n source: normalized,\n filename: ctx.name ?? \"input.bin\",\n context: ctx,\n // transport config is not yet threaded through ConvertOptions; add\n // later if URL-source transcode with signed URLs becomes a need.\n });\n\n try {\n options.signal?.throwIfAborted();\n\n if (!demux.videoStream && !demux.audioStream) {\n throw new Error(\"transcode: source has no decodable tracks\");\n }\n\n // ── Set up mediabunny Output (BufferTarget — in-memory) ──────────\n // outputStream is not yet supported for the libav path — the\n // sample-source + encoder chain doesn't expose the same StreamTarget\n // hook that mediabunny's Conversion uses internally. Flag loudly.\n if (options.outputStream) {\n throw new AvbridgeError(\n ERR_TRANSCODE_UNSUPPORTED_COMBO,\n \"outputStream is not yet supported for the libav-backed transcode path.\",\n \"Remove the outputStream option to receive the transcoded blob in memory. Streaming output for this path is on the roadmap.\",\n );\n }\n const bufferTarget = new mb.BufferTarget();\n const output = new mb.Output({\n format: createOutputFormat(mb, outputFormat),\n target: bufferTarget,\n });\n\n // ── Bridge (libavjs-webcodecs-bridge) for packet → EncodedVideoChunk\n const bridge = await loadBridge();\n\n // ── Video decoder (WebCodecs) + sample source (mediabunny) ───────\n // Video decode has two possible paths:\n // - WebCodecs (hardware or browser's software decoder) — used when\n // `VideoDecoder.isConfigSupported(config)` returns true. Fast.\n // - libav software decode — used when WebCodecs can't handle the codec.\n // Required for RealMedia (rv40/etc.), where the source codec isn't in\n // any browser. The output is still a VideoFrame (via the bridge's\n // laFrameToVideoFrame), so the downstream queue+drain is unchanged.\n let videoDecoder: VideoDecoder | null = null;\n let videoSoftDec: { c: number; pkt: number; frame: number } | null = null;\n let videoSource: InstanceType<typeof mb.VideoSampleSource> | null = null;\n let videoBsfCtx: number | null = null;\n let videoBsfPkt: number | null = null;\n let videoWidth = 0;\n let videoHeight = 0;\n let videoTimeBase: [number, number] | undefined;\n\n // Explicit queue + drain for VideoDecoder.output → videoSource.add.\n // VideoDecoder.output is fire-and-forget, videoSource.add is async\n // and backpressures. Without a queue + single-flight drain, we'd\n // either lose backpressure (memory blow-up) or let in-flight `add`\n // calls interleave out of order. Phase 1 correctness depends on this.\n const frameQueue: VideoFrame[] = [];\n const MAX_QUEUE = 16;\n let draining = false;\n let drainError: Error | null = null;\n // Promise of the currently-running drain (for explicit await at EOF).\n let activeDrain: Promise<void> | null = null;\n\n const drain = (): Promise<void> => {\n if (draining) return activeDrain ?? Promise.resolve();\n draining = true;\n const run = (async () => {\n try {\n while (frameQueue.length > 0 && !drainError) {\n const frame = frameQueue.shift()!;\n try {\n const sample = new mb.VideoSample(frame, {\n timestamp: (frame.timestamp ?? 0) / 1_000_000, // µs → s\n });\n await videoSource!.add(sample);\n } finally {\n frame.close();\n }\n }\n } catch (err) {\n drainError = err as Error;\n // Release any queued frames so we don't leak VideoFrames.\n while (frameQueue.length > 0) {\n try { frameQueue.shift()!.close(); } catch { /* ignore */ }\n }\n } finally {\n draining = false;\n activeDrain = null;\n }\n })();\n activeDrain = run;\n return run;\n };\n\n if (demux.videoStream && !options.dropVideo) {\n try {\n // Phase 1: refuse 10-bit. Neither decode path produces pixel\n // formats that mediabunny's encoders reliably consume.\n const bitDepth = ctx.videoTracks[0]?.bitDepth ?? 8;\n if (bitDepth > 8) {\n throw new AvbridgeError(\n ERR_TRANSCODE_UNSUPPORTED_COMBO,\n `transcode: 10-bit video is not supported in this release (source bit depth: ${bitDepth}).`,\n `Phase 1 transcode handles 8-bit video only. 10-bit support is on the roadmap.`,\n );\n }\n\n if (demux.videoStream.time_base_num && demux.videoStream.time_base_den) {\n videoTimeBase = [demux.videoStream.time_base_num, demux.videoStream.time_base_den];\n }\n\n // Try WebCodecs first. If the bridge can build a config AND the\n // browser's VideoDecoder supports it, use hardware/native decode.\n // Otherwise fall back to libav software decode (rv40, etc.).\n let config: VideoDecoderConfig | null = null;\n try {\n config = await bridge.videoStreamToConfig(demux.libav, demux.videoStream);\n } catch {\n config = null;\n }\n const supported = config\n ? await VideoDecoder.isConfigSupported(config).catch(() => ({ supported: false }))\n : { supported: false };\n\n videoWidth = (config?.codedWidth ?? ctx.videoTracks[0]?.width) ?? 0;\n videoHeight = (config?.codedHeight ?? ctx.videoTracks[0]?.height) ?? 0;\n\n if (config && supported.supported) {\n // ── WebCodecs path ──\n videoDecoder = new VideoDecoder({\n output: (frame) => {\n if (frameQueue.length >= MAX_QUEUE) {\n frame.close();\n return;\n }\n frameQueue.push(frame);\n void drain();\n },\n error: (err) => {\n drainError = err as unknown as Error;\n },\n });\n videoDecoder.configure(config);\n } else {\n // ── libav software decode path ──\n // RealMedia (rv10/20/30/40) and any other codec WebCodecs doesn't\n // support lands here. The libav variant picker already routes\n // rm/rv* to the \"avbridge\" variant via codec-set inspection.\n const libavSoft = demux.libav as unknown as LibavSoftVideo;\n const [, c, pkt, frame] = await libavSoft.ff_init_decoder(\n demux.videoStream.codec_id,\n { codecpar: demux.videoStream.codecpar },\n );\n videoSoftDec = { c, pkt, frame };\n }\n\n videoSource = new mb.VideoSampleSource({\n codec: avbridgeVideoToMediabunny(videoCodec),\n bitrate: qualityToMediabunny(mb, quality, options.videoBitrate),\n ...(options.frameRate !== undefined ? { frameRate: options.frameRate } : {}),\n ...(options.hardwareAcceleration !== undefined\n ? { hardwareAcceleration: options.hardwareAcceleration }\n : {}),\n // Progress reporting: media-time-based via each encoded packet.\n onEncodedPacket: options.onProgress\n ? (packet) => {\n const t = packet.timestamp;\n if (Number.isFinite(t) && ctx.duration && ctx.duration > 0) {\n const pct = Math.min(100, (t / ctx.duration) * 100);\n options.onProgress!({ percent: pct, bytesWritten: 0 });\n }\n }\n : undefined,\n });\n\n const videoMeta: { width?: number; height?: number; frameRate?: number } = {};\n if (options.width !== undefined) videoMeta.width = options.width;\n else if (videoWidth > 0) videoMeta.width = videoWidth;\n if (options.height !== undefined) videoMeta.height = options.height;\n else if (videoHeight > 0) videoMeta.height = videoHeight;\n if (options.frameRate !== undefined) videoMeta.frameRate = options.frameRate;\n output.addVideoTrack(videoSource, videoMeta);\n\n // mpeg4 packed-bframes BSF — same as hybrid/fallback.\n if (ctx.videoTracks[0]?.codec === \"mpeg4\") {\n const runtime = demux.libav as unknown as LibavBsf;\n try {\n videoBsfCtx = await runtime.av_bsf_list_parse_str_js(\"mpeg4_unpack_bframes\");\n if (videoBsfCtx != null && videoBsfCtx >= 0) {\n const parIn = await runtime.AVBSFContext_par_in(videoBsfCtx);\n await runtime.avcodec_parameters_copy(parIn, demux.videoStream.codecpar);\n await runtime.av_bsf_init(videoBsfCtx);\n videoBsfPkt = await (demux.libav as unknown as { av_packet_alloc(): Promise<number> })\n .av_packet_alloc();\n } else {\n videoBsfCtx = null;\n }\n } catch {\n videoBsfCtx = null;\n }\n }\n } catch (err) {\n if (err instanceof AvbridgeError) throw err;\n throw new AvbridgeError(\n ERR_CODEC_NOT_SUPPORTED,\n `transcode: video decoder init failed: ${(err as Error).message}`,\n `The source's video codec may not be supported by this browser's WebCodecs implementation.`,\n );\n }\n }\n\n // ── Audio decoder (libav software) + sample source ───────────────\n interface SoftDecoder { c: number; pkt: number; frame: number; }\n let audioDec: SoftDecoder | null = null;\n let audioSource: InstanceType<typeof mb.AudioSampleSource> | null = null;\n let audioTimeBase: [number, number] | undefined;\n\n const includeAudio = demux.audioStream && !options.dropAudio;\n if (includeAudio) {\n try {\n const libav = demux.libav as unknown as LibavAudio;\n const [, c, pkt, frame] = await libav.ff_init_decoder(\n demux.audioStream!.codec_id,\n { codecpar: demux.audioStream!.codecpar },\n );\n audioDec = { c, pkt, frame };\n if (demux.audioStream!.time_base_num && demux.audioStream!.time_base_den) {\n audioTimeBase = [\n demux.audioStream!.time_base_num,\n demux.audioStream!.time_base_den,\n ];\n }\n\n audioSource = new mb.AudioSampleSource({\n codec: avbridgeAudioToMediabunny(audioCodec),\n bitrate: qualityToMediabunny(mb, quality, options.audioBitrate),\n });\n output.addAudioTrack(audioSource);\n } catch (err) {\n const codecName = ctx.audioTracks[0]?.codec ?? \"unknown\";\n throw new AvbridgeError(\n ERR_CODEC_NOT_SUPPORTED,\n `transcode: no decoder available for audio codec \"${codecName}\" in this libav variant (${(err as Error).message}).`,\n `The file may still play via createPlayer() (fallback strategy). Pass { dropAudio: true } to transcode video-only.`,\n );\n }\n } else if (options.dropAudio) {\n // Caller asked for video-only — don't add an audio track.\n }\n\n if (!videoSource && !audioSource) {\n throw new AvbridgeError(\n ERR_TRANSCODE_UNSUPPORTED_COMBO,\n \"transcode: no video or audio track to encode (did you set both dropVideo and dropAudio?).\",\n \"Remove dropVideo or dropAudio to include at least one track.\",\n );\n }\n\n await output.start();\n\n // ── Synthetic timestamp counters for packets without valid PTS ──\n const videoFps = ctx.videoTracks[0]?.fps && ctx.videoTracks[0]!.fps > 0\n ? ctx.videoTracks[0]!.fps\n : 30;\n const videoFrameStepUs = Math.max(1, Math.round(1_000_000 / videoFps));\n let syntheticVideoUs = 0;\n let syntheticAudioUs = 0;\n\n // BSF helpers (only if bsfCtx initialized)\n const libavFull = demux.libav as unknown as LibavBsf & { ff_copyin_packet(a: number, b: LibavPacket): Promise<void>; ff_copyout_packet(a: number): Promise<LibavPacket>; };\n async function applyBSF(packets: LibavPacket[]): Promise<LibavPacket[]> {\n if (!videoBsfCtx || !videoBsfPkt) return packets;\n const out: LibavPacket[] = [];\n for (const pkt of packets) {\n await libavFull.ff_copyin_packet(videoBsfPkt, pkt);\n const sendErr = await libavFull.av_bsf_send_packet(videoBsfCtx, videoBsfPkt);\n if (sendErr < 0) { out.push(pkt); continue; }\n while (true) {\n const recvErr = await libavFull.av_bsf_receive_packet(videoBsfCtx, videoBsfPkt);\n if (recvErr < 0) break;\n out.push(await libavFull.ff_copyout_packet(videoBsfPkt));\n }\n }\n return out;\n }\n\n // Guarded access: signal cancellation is honored between batches\n // and at queue-wait checkpoints.\n const ac = options.signal;\n function throwIfAborted(): void {\n if (ac?.aborted) {\n throw new AvbridgeError(\n ERR_TRANSCODE_ABORTED,\n \"transcode: aborted by caller.\",\n undefined,\n );\n }\n }\n\n function throwIfDrainError(): void {\n if (drainError) {\n const msg = drainError.message;\n throw new AvbridgeError(\n ERR_TRANSCODE_DECODE,\n `transcode: video decoder error: ${msg}`,\n \"This usually indicates the WebCodecs decoder rejected a malformed packet.\",\n );\n }\n }\n\n // ── Pump ────────────────────────────────────────────────────────\n const onVideoPacketsWebCodecs = videoDecoder\n ? async (pkts: LibavPacket[]) => {\n throwIfAborted();\n throwIfDrainError();\n while (\n !ac?.aborted &&\n (videoDecoder!.decodeQueueSize > 16 || frameQueue.length >= MAX_QUEUE - 2)\n ) {\n await new Promise((r) => setTimeout(r, 10));\n }\n throwIfAborted();\n\n const processed = await applyBSF(pkts);\n const bridgeAny = bridge as unknown as {\n packetToEncodedVideoChunk(pkt: unknown, stream: unknown): EncodedVideoChunk;\n };\n for (const pkt of processed) {\n sanitizePacketTimestamp(pkt, () => {\n const ts = syntheticVideoUs;\n syntheticVideoUs += videoFrameStepUs;\n return ts;\n }, videoTimeBase);\n try {\n const chunk = bridgeAny.packetToEncodedVideoChunk(pkt, demux.videoStream);\n videoDecoder!.decode(chunk);\n } catch (err) {\n throw new AvbridgeError(\n ERR_TRANSCODE_DECODE,\n `transcode: packet → EncodedVideoChunk failed: ${(err as Error).message}`,\n undefined,\n );\n }\n }\n }\n : undefined;\n\n const onVideoPacketsSoftware = videoSoftDec\n ? async (pkts: LibavPacket[]) => {\n throwIfAborted();\n throwIfDrainError();\n // Only frameQueue backpressure — no WebCodecs queue.\n while (!ac?.aborted && frameQueue.length >= MAX_QUEUE - 2) {\n await new Promise((r) => setTimeout(r, 10));\n }\n throwIfAborted();\n\n const libavSoft = demux.libav as unknown as LibavSoftVideo;\n let frames;\n try {\n frames = await libavSoft.ff_decode_multi(\n videoSoftDec!.c, videoSoftDec!.pkt, videoSoftDec!.frame, pkts,\n { ignoreErrors: true },\n );\n } catch (err) {\n throw new AvbridgeError(\n ERR_TRANSCODE_DECODE,\n `transcode: software video decode failed: ${(err as Error).message}`,\n undefined,\n );\n }\n for (const f of frames) {\n sanitizeFrameTimestamp(f, () => {\n const ts = syntheticVideoUs;\n syntheticVideoUs += videoFrameStepUs;\n return ts;\n }, videoTimeBase);\n try {\n // Bridge consumes any libav-decoded frame (software or\n // hardware) and returns a WebCodecs VideoFrame.\n const vf = bridge.laFrameToVideoFrame(f, { timeBase: [1, 1_000_000] });\n if (frameQueue.length >= MAX_QUEUE) {\n vf.close();\n } else {\n frameQueue.push(vf);\n void drain();\n }\n } catch (err) {\n throw new AvbridgeError(\n ERR_TRANSCODE_DECODE,\n `transcode: laFrameToVideoFrame failed: ${(err as Error).message}`,\n undefined,\n );\n }\n }\n }\n : undefined;\n\n await demux.pump({\n signal: ac,\n onVideoPackets: onVideoPacketsWebCodecs ?? onVideoPacketsSoftware,\n onAudioPackets: audioDec\n ? async (pkts) => {\n throwIfAborted();\n await decodeAudioBatch(pkts, false);\n }\n : undefined,\n onEof: async () => {\n // Drain video: flush decoder, then wait for our queue to empty.\n if (videoDecoder && videoDecoder.state === \"configured\") {\n try { await videoDecoder.flush(); } catch { /* ignore */ }\n }\n if (videoSoftDec) {\n // Flush the software decoder with fin: true so any internally\n // buffered frames come out.\n const libavSoft = demux.libav as unknown as LibavSoftVideo;\n try {\n const tail = await libavSoft.ff_decode_multi(\n videoSoftDec.c, videoSoftDec.pkt, videoSoftDec.frame, [],\n { fin: true, ignoreErrors: true },\n );\n for (const f of tail) {\n sanitizeFrameTimestamp(f, () => {\n const ts = syntheticVideoUs;\n syntheticVideoUs += videoFrameStepUs;\n return ts;\n }, videoTimeBase);\n try {\n const vf = bridge.laFrameToVideoFrame(f, { timeBase: [1, 1_000_000] });\n frameQueue.push(vf);\n void drain();\n } catch { /* ignore per-frame failures during flush */ }\n }\n } catch { /* ignore */ }\n }\n // A final drain() kick to consume any post-flush frames.\n await drain();\n // Drain audio: flush the libav decoder.\n if (audioDec) {\n await decodeAudioBatch([], true);\n }\n },\n });\n\n throwIfAborted();\n throwIfDrainError();\n\n // Close the sample sources so mediabunny finalizes track metadata.\n videoSource?.close();\n audioSource?.close();\n\n await output.finalize();\n\n if (!bufferTarget.buffer) {\n throw new Error(\"transcode: mediabunny produced no output buffer\");\n }\n const mimeType = mimeForFormat(outputFormat);\n const blob = new Blob([bufferTarget.buffer], { type: mimeType });\n options.onProgress?.({ percent: 100, bytesWritten: blob.size });\n\n return {\n blob,\n mimeType,\n container: outputFormat,\n videoCodec: videoSource ? videoCodec : undefined,\n audioCodec: audioSource ? audioCodec : undefined,\n duration: ctx.duration,\n filename: generateFilename(ctx.name, outputFormat),\n };\n\n // ── Helpers closing over the above state ────────────────────────\n async function decodeAudioBatch(pkts: LibavPacket[], flush: boolean): Promise<void> {\n if (!audioDec || !audioSource) return;\n const libav = demux.libav as unknown as LibavAudio;\n let frames;\n try {\n frames = await libav.ff_decode_multi(\n audioDec.c,\n audioDec.pkt,\n audioDec.frame,\n pkts,\n flush ? { fin: true, ignoreErrors: true } : { ignoreErrors: true },\n );\n } catch (err) {\n throw new AvbridgeError(\n ERR_TRANSCODE_DECODE,\n `transcode: audio decode failed: ${(err as Error).message}`,\n undefined,\n );\n }\n for (const f of frames) {\n sanitizeFrameTimestamp(f, () => {\n const ts = syntheticAudioUs;\n const samples = f.nb_samples ?? 1024;\n const sampleRate = f.sample_rate ?? 44100;\n syntheticAudioUs += Math.round((samples * 1_000_000) / sampleRate);\n return ts;\n }, audioTimeBase);\n const pcm = libavFrameToInterleavedFloat32(f);\n if (!pcm) continue;\n // AudioSample wants a typed AudioSampleInit. f32 interleaved.\n const sample = new mb.AudioSample({\n data: pcm.data,\n format: \"f32\",\n numberOfChannels: pcm.channels,\n sampleRate: pcm.sampleRate,\n timestamp: (f.pts ?? 0) / 1_000_000,\n });\n await audioSource.add(sample);\n }\n }\n } finally {\n // Teardown: close decoders, free BSF, close demuxer.\n try { await demux.destroy(); } catch { /* ignore */ }\n // Note: videoDecoder / audioDec cleanup happens implicitly; the demuxer\n // destroy releases the fmt_ctx, and our sample sources + Output\n // finalization release the encoder side. Explicit frees here would\n // race with in-flight decode calls on error paths; we accept the\n // short-lived leak.\n }\n // Reference types used in this file. Declared locally to avoid leaking\n // into the shared helper module.\n interface LibavAudio {\n ff_init_decoder(\n codec: number | string,\n config?: { codecpar?: number; time_base?: [number, number] },\n ): Promise<[number, number, number, number]>;\n ff_decode_multi(\n c: number,\n pkt: number,\n frame: number,\n packets: LibavPacket[],\n opts?: { fin?: boolean; ignoreErrors?: boolean },\n ): Promise<import(\"../util/libav-demux.js\").LibavFrame[]>;\n }\n // Software video decode uses the same surface as audio. Aliased for\n // readability at callsites.\n type LibavSoftVideo = LibavAudio;\n interface LibavBsf {\n av_bsf_list_parse_str_js(str: string): Promise<number>;\n AVBSFContext_par_in(ctx: number): Promise<number>;\n avcodec_parameters_copy(dst: number, src: number): Promise<number>;\n av_bsf_init(ctx: number): Promise<number>;\n av_bsf_send_packet(ctx: number, pkt: number): Promise<number>;\n av_bsf_receive_packet(ctx: number, pkt: number): Promise<number>;\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function loadBridge(): Promise<BridgeModule> {\n try {\n const wrapper = await import(\"../strategies/fallback/libav-import.js\");\n return wrapper.libavBridge as unknown as BridgeModule;\n } catch (err) {\n throw new Error(`failed to load libavjs-webcodecs-bridge: ${(err as Error).message}`);\n }\n}\n\ninterface BridgeModule {\n videoStreamToConfig(libav: unknown, stream: unknown): Promise<VideoDecoderConfig | null>;\n packetToEncodedVideoChunk(pkt: unknown, stream: unknown): EncodedVideoChunk;\n laFrameToVideoFrame(\n frame: unknown,\n opts?: { timeBase?: [number, number]; transfer?: boolean },\n ): VideoFrame;\n}\n\nfunction avbridgeVideoToMediabunny(c: OutputVideoCodec): \"avc\" | \"hevc\" | \"vp9\" | \"av1\" {\n switch (c) {\n case \"h264\": return \"avc\";\n case \"h265\": return \"hevc\";\n case \"vp9\": return \"vp9\";\n case \"av1\": return \"av1\";\n }\n}\n\nfunction avbridgeAudioToMediabunny(c: OutputAudioCodec): \"aac\" | \"opus\" | \"flac\" {\n switch (c) {\n case \"aac\": return \"aac\";\n case \"opus\": return \"opus\";\n case \"flac\": return \"flac\";\n }\n}\n\nfunction qualityToMediabunny(\n mb: typeof import(\"mediabunny\"),\n quality: TranscodeQuality,\n override: number | undefined,\n): number | InstanceType<typeof mb.Quality> {\n if (override !== undefined) return override;\n switch (quality) {\n case \"low\": return mb.QUALITY_LOW;\n case \"medium\": return mb.QUALITY_MEDIUM;\n case \"high\": return mb.QUALITY_HIGH;\n case \"very-high\": return mb.QUALITY_VERY_HIGH;\n }\n}\n","/**\n * Standalone transcode function: re-encode media into a modern container with\n * modern codecs. Unlike {@link remux}, this is a lossy operation that decodes\n * and re-encodes the streams.\n *\n * Built on top of mediabunny's `Conversion` class which handles the full\n * decode → encode → mux pipeline. WebCodecs encoders are used when available;\n * mediabunny falls back to other paths internally.\n *\n * Limitations in v1:\n * - Input must be in a mediabunny-readable container (MP4, MKV, WebM, OGG, ...).\n * AVI/ASF/FLV sources are not yet supported by transcode (use remux + native\n * playback or wait for v1.1).\n */\n\nimport { probe } from \"../probe/index.js\";\nimport { buildMediabunnySourceFromInput } from \"../probe/mediabunny.js\";\nimport { createOutputFormat, mimeForFormat, generateFilename } from \"./remux.js\";\nimport { isLibavTranscodeContainer, transcodeViaLibav } from \"./transcode-libav.js\";\nimport { AvbridgeError, ERR_CONTAINER_NOT_SUPPORTED } from \"../errors.js\";\nimport type {\n MediaInput,\n MediaContext,\n TranscodeOptions,\n ConvertResult,\n OutputFormat,\n OutputVideoCodec,\n OutputAudioCodec,\n TranscodeQuality,\n} from \"../types.js\";\n\n/** Containers mediabunny can demux. AVI/ASF/FLV are not in this set. */\nconst MEDIABUNNY_CONTAINERS = new Set([\n \"mp4\", \"mov\", \"mkv\", \"webm\", \"ogg\", \"wav\", \"mp3\", \"flac\", \"adts\",\n]);\n\n/**\n * Transcode a media source into a modern container with modern codecs.\n *\n * Re-encodes both video and audio. Use {@link remux} instead when the source\n * codecs are already modern and only the container needs changing — it's much\n * faster and lossless.\n */\nexport async function transcode(\n source: MediaInput,\n options: TranscodeOptions = {},\n): Promise<ConvertResult> {\n const outputFormat: OutputFormat = options.outputFormat ?? \"mp4\";\n const videoCodec = options.videoCodec ?? defaultVideoCodec(outputFormat);\n const audioCodec = options.audioCodec ?? defaultAudioCodec(outputFormat);\n const quality = options.quality ?? \"medium\";\n\n validateCodecCompatibility(outputFormat, videoCodec, audioCodec);\n options.signal?.throwIfAborted();\n\n const ctx = await probe(source);\n options.signal?.throwIfAborted();\n\n // AVI/ASF/FLV → the libav-demux-backed pipeline (Phase 1: MP4 output only).\n if (isLibavTranscodeContainer(ctx.container)) {\n return transcodeViaLibav(ctx, options);\n }\n\n if (!MEDIABUNNY_CONTAINERS.has(ctx.container)) {\n throw new AvbridgeError(\n ERR_CONTAINER_NOT_SUPPORTED,\n `Cannot transcode \"${ctx.container}\" sources. ` +\n `transcode() supports mediabunny-readable containers (MP4, MKV, WebM, OGG, MP3, FLAC, WAV, MOV) and legacy containers via the libav path (AVI, ASF, FLV).`,\n `If this is a legacy container we don't yet support, use createPlayer() to play it. Transcode support for more containers is on the roadmap.`,\n );\n }\n\n return doTranscode(ctx, outputFormat, videoCodec, audioCodec, quality, options);\n}\n\n/**\n * One attempt at the full mediabunny conversion. Each attempt allocates\n * fresh `Input` / `Output` / `Conversion` instances because they are all\n * single-use in mediabunny.\n *\n * Returns the muxed `ArrayBuffer` on success. Throws on failure.\n */\nasync function attemptTranscode(\n ctx: MediaContext,\n outputFormat: OutputFormat,\n videoCodec: OutputVideoCodec,\n audioCodec: OutputAudioCodec,\n quality: TranscodeQuality,\n options: TranscodeOptions,\n): Promise<ArrayBuffer | null> {\n const mb = await import(\"mediabunny\");\n\n const input = new mb.Input({\n source: await buildMediabunnySourceFromInput(mb, ctx.source),\n formats: mb.ALL_FORMATS,\n });\n\n // When outputStream is provided, pipe chunks directly to the stream\n // instead of accumulating into a buffer. This keeps memory usage flat\n // regardless of file size.\n let bytesWritten = 0;\n const useStream = !!options.outputStream;\n const bufferTarget = useStream ? null : new mb.BufferTarget();\n const streamTarget = useStream\n ? new mb.StreamTarget(new WritableStream({\n write(chunk: { type: string; data: Uint8Array; position: number }) {\n bytesWritten += chunk.data.byteLength;\n const writer = options.outputStream!.getWriter();\n return writer.write(chunk.data).then(() => writer.releaseLock());\n },\n }))\n : null;\n\n const output = new mb.Output({\n format: createOutputFormat(mb, outputFormat),\n target: (streamTarget ?? bufferTarget)!,\n });\n\n // Build mediabunny ConversionVideoOptions\n const videoOptions = options.dropVideo\n ? { discard: true as const }\n : {\n codec: avbridgeVideoToMediabunny(videoCodec),\n bitrate: options.videoBitrate ?? qualityToMediabunny(mb, quality),\n forceTranscode: true,\n ...(options.width !== undefined ? { width: options.width } : {}),\n ...(options.height !== undefined ? { height: options.height } : {}),\n ...(options.width !== undefined && options.height !== undefined\n ? { fit: \"contain\" as const }\n : {}),\n ...(options.frameRate !== undefined ? { frameRate: options.frameRate } : {}),\n ...(options.hardwareAcceleration !== undefined\n ? { hardwareAcceleration: options.hardwareAcceleration }\n : {}),\n };\n\n const audioOptions = options.dropAudio\n ? { discard: true as const }\n : {\n codec: avbridgeAudioToMediabunny(audioCodec),\n bitrate: options.audioBitrate ?? qualityToMediabunny(mb, quality),\n forceTranscode: true,\n };\n\n const conversion = await mb.Conversion.init({\n input,\n output,\n video: videoOptions,\n audio: audioOptions,\n showWarnings: false,\n });\n\n if (!conversion.isValid) {\n const reasons = conversion.discardedTracks\n .map((d) => `${d.track.type} track discarded: ${d.reason}`)\n .join(\"; \");\n throw new Error(\n `Cannot transcode: mediabunny rejected the conversion. ${reasons || \"(no reason given)\"}`,\n );\n }\n\n // Wire progress\n if (options.onProgress) {\n const onProgress = options.onProgress;\n conversion.onProgress = (p) => {\n onProgress({ percent: p * 100, bytesWritten: 0 });\n };\n }\n\n // Wire cancellation\n let abortHandler: (() => void) | undefined;\n if (options.signal) {\n options.signal.throwIfAborted();\n abortHandler = () => void conversion.cancel();\n options.signal.addEventListener(\"abort\", abortHandler, { once: true });\n }\n\n try {\n await conversion.execute();\n } finally {\n if (abortHandler && options.signal) {\n options.signal.removeEventListener(\"abort\", abortHandler);\n }\n }\n\n if (useStream) {\n return null; // data already written to outputStream\n }\n if (!bufferTarget!.buffer) {\n throw new Error(\"Transcode failed: mediabunny produced no output buffer.\");\n }\n return bufferTarget!.buffer;\n}\n\n/**\n * Detect the \"Encoding error\" failure pattern that headless Chromium's\n * H.264 WebCodecs encoder hits on its first call per page. The encoder\n * is fully usable on the second attempt, so we retry once.\n *\n * See <https://issues.chromium.org/> — this is a known first-call init\n * issue in the OS-backed encoder pipeline (VideoToolbox on macOS).\n */\nfunction isLikelyEncoderInitError(err: unknown): boolean {\n if (!err) return false;\n const msg = err instanceof Error ? err.message : String(err);\n const lower = msg.toLowerCase();\n // The exact strings WebCodecs / mediabunny surface for encoder failures.\n return (\n lower.includes(\"encoding error\") ||\n lower.includes(\"encoder\") ||\n lower.includes(\"encode failed\")\n );\n}\n\nfunction describeError(err: unknown): string {\n if (!err) return \"(unknown)\";\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n/**\n * Maximum encoder retry attempts. Headless Chromium's H.264 WebCodecs\n * encoder hits a first-call init failure and *usually* recovers on the\n * second attempt — but in rare cases the second attempt also fails. Two\n * extra attempts (3 total) is enough to make the smoke test reliable\n * without masking real bugs.\n */\nconst MAX_ENCODER_RETRIES = 2;\n\nasync function doTranscode(\n ctx: MediaContext,\n outputFormat: OutputFormat,\n videoCodec: OutputVideoCodec,\n audioCodec: OutputAudioCodec,\n quality: TranscodeQuality,\n options: TranscodeOptions,\n): Promise<ConvertResult> {\n const notes: string[] = [];\n let buffer: ArrayBuffer | null = null;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= MAX_ENCODER_RETRIES; attempt++) {\n try {\n buffer = await attemptTranscode(ctx, outputFormat, videoCodec, audioCodec, quality, options);\n if (attempt > 0) {\n notes.push(\n `Encoder failed ${attempt} time${attempt === 1 ? \"\" : \"s\"} before succeeding ` +\n `(known headless Chromium WebCodecs encoder init issue): ${describeError(lastError)}`,\n );\n }\n break;\n } catch (err) {\n lastError = err;\n // Don't retry on user cancellation or permanent setup errors.\n if (options.signal?.aborted) throw err;\n if (!isLikelyEncoderInitError(err)) throw err;\n if (attempt === MAX_ENCODER_RETRIES) throw err;\n // Small backoff between attempts.\n await new Promise((r) => setTimeout(r, 50 * (attempt + 1)));\n }\n }\n\n const mimeType = mimeForFormat(outputFormat);\n const filename = generateFilename(ctx.name, outputFormat);\n\n if (options.outputStream) {\n // Streaming mode — data already written to the stream. Return empty blob.\n options.onProgress?.({ percent: 100, bytesWritten: 0 });\n return {\n blob: new Blob([], { type: mimeType }),\n mimeType,\n container: outputFormat,\n videoCodec: options.dropVideo ? undefined : videoCodec,\n audioCodec: options.dropAudio ? undefined : audioCodec,\n duration: ctx.duration,\n filename,\n ...(notes.length > 0 ? { notes } : {}),\n };\n }\n\n if (!buffer) {\n throw new Error(\"Transcode failed: no buffer produced (this should be unreachable).\");\n }\n\n const blob = new Blob([buffer], { type: mimeType });\n options.onProgress?.({ percent: 100, bytesWritten: blob.size });\n\n return {\n blob,\n mimeType,\n container: outputFormat,\n videoCodec: options.dropVideo ? undefined : videoCodec,\n audioCodec: options.dropAudio ? undefined : audioCodec,\n duration: ctx.duration,\n filename,\n ...(notes.length > 0 ? { notes } : {}),\n };\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\n/** @internal Exported for testing. */\nexport function defaultVideoCodec(format: OutputFormat): OutputVideoCodec {\n switch (format) {\n case \"webm\": return \"vp9\";\n case \"mp4\":\n case \"mkv\":\n default: return \"h264\";\n }\n}\n\n/** @internal Exported for testing. */\nexport function defaultAudioCodec(format: OutputFormat): OutputAudioCodec {\n switch (format) {\n case \"webm\": return \"opus\";\n case \"mp4\":\n case \"mkv\":\n default: return \"aac\";\n }\n}\n\n/** @internal Exported for testing. */\nexport function validateCodecCompatibility(\n format: OutputFormat,\n videoCodec: OutputVideoCodec,\n audioCodec: OutputAudioCodec,\n): void {\n // WebM only allows VP8/VP9/AV1 video and Opus/Vorbis audio.\n if (format === \"webm\") {\n if (videoCodec !== \"vp9\" && videoCodec !== \"av1\") {\n throw new Error(\n `WebM does not support video codec \"${videoCodec}\". Use \"vp9\" or \"av1\", or change outputFormat to \"mp4\" or \"mkv\".`,\n );\n }\n if (audioCodec !== \"opus\") {\n throw new Error(\n `WebM does not support audio codec \"${audioCodec}\". Use \"opus\", or change outputFormat to \"mp4\" or \"mkv\".`,\n );\n }\n }\n}\n\nfunction avbridgeVideoToMediabunny(c: OutputVideoCodec): \"avc\" | \"hevc\" | \"vp9\" | \"av1\" {\n switch (c) {\n case \"h264\": return \"avc\";\n case \"h265\": return \"hevc\";\n case \"vp9\": return \"vp9\";\n case \"av1\": return \"av1\";\n }\n}\n\nfunction avbridgeAudioToMediabunny(c: OutputAudioCodec): \"aac\" | \"opus\" | \"flac\" {\n switch (c) {\n case \"aac\": return \"aac\";\n case \"opus\": return \"opus\";\n case \"flac\": return \"flac\";\n }\n}\n\nfunction qualityToMediabunny(\n mb: typeof import(\"mediabunny\"),\n quality: TranscodeQuality,\n): InstanceType<typeof mb.Quality> {\n switch (quality) {\n case \"low\": return mb.QUALITY_LOW;\n case \"medium\": return mb.QUALITY_MEDIUM;\n case \"high\": return mb.QUALITY_HIGH;\n case \"very-high\": return mb.QUALITY_VERY_HIGH;\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var chunkCPZ7PXAM_cjs = require('./chunk-CPZ7PXAM.cjs');
4
+ require('./chunk-Z33SBWL5.cjs');
5
+ require('./chunk-G4APZMCP.cjs');
6
+ require('./chunk-F3LQJKXK.cjs');
7
+
8
+
9
+
10
+ Object.defineProperty(exports, "libavFrameToInterleavedFloat32", {
11
+ enumerable: true,
12
+ get: function () { return chunkCPZ7PXAM_cjs.libavFrameToInterleavedFloat32; }
13
+ });
14
+ Object.defineProperty(exports, "openLibavDemux", {
15
+ enumerable: true,
16
+ get: function () { return chunkCPZ7PXAM_cjs.openLibavDemux; }
17
+ });
18
+ Object.defineProperty(exports, "sanitizeFrameTimestamp", {
19
+ enumerable: true,
20
+ get: function () { return chunkCPZ7PXAM_cjs.sanitizeFrameTimestamp; }
21
+ });
22
+ Object.defineProperty(exports, "sanitizePacketTimestamp", {
23
+ enumerable: true,
24
+ get: function () { return chunkCPZ7PXAM_cjs.sanitizePacketTimestamp; }
25
+ });
26
+ //# sourceMappingURL=libav-demux-H2GS46GH.cjs.map
27
+ //# sourceMappingURL=libav-demux-H2GS46GH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"libav-demux-H2GS46GH.cjs"}
@@ -0,0 +1,6 @@
1
+ export { libavFrameToInterleavedFloat32, openLibavDemux, sanitizeFrameTimestamp, sanitizePacketTimestamp } from './chunk-X2K3GIWE.js';
2
+ import './chunk-DCSOQH2N.js';
3
+ import './chunk-5DMTJVIU.js';
4
+ import './chunk-5YAWWKA3.js';
5
+ //# sourceMappingURL=libav-demux-OWZ4T2YW.js.map
6
+ //# sourceMappingURL=libav-demux-OWZ4T2YW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"libav-demux-OWZ4T2YW.js"}
@@ -26,5 +26,5 @@ var bridge__namespace = /*#__PURE__*/_interopNamespace(bridge);
26
26
  var libavBridge = bridge__namespace;
27
27
 
28
28
  exports.libavBridge = libavBridge;
29
- //# sourceMappingURL=libav-import-GST2AMPL.cjs.map
30
- //# sourceMappingURL=libav-import-GST2AMPL.cjs.map
29
+ //# sourceMappingURL=libav-import-2ZVKV2E7.cjs.map
30
+ //# sourceMappingURL=libav-import-2ZVKV2E7.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/strategies/fallback/libav-import.ts"],"names":["bridge"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,IAAM,WAAA,GAA4BA","file":"libav-import-GST2AMPL.cjs","sourcesContent":["/**\n * Static-import wrapper for the libavjs-webcodecs-bridge optional peer dep.\n *\n * The variant itself is **not** imported here — it's loaded via a runtime\n * dynamic import with `/* @vite-ignore *\\/` from `libav-loader.ts`, so the\n * variant's `.mjs` file is never touched by Vite's transform pipeline (which\n * would otherwise pre-bundle it and break the `import.meta.url`-based path\n * resolution it uses to find its sibling .wasm files).\n *\n * The bridge has no such issue — it's pure JS and doesn't reference sibling\n * binaries — so a normal static import is fine here.\n *\n * TypeScript resolves `libavjs-webcodecs-bridge` via the `paths` mapping in\n * tsconfig.json which redirects to `src/libav-stubs.d.ts`, sidestepping the\n * polyfill source files that don't typecheck under TS 5.7.\n */\nimport * as bridge from \"libavjs-webcodecs-bridge\";\n\nexport const libavBridge: BridgeModule = bridge as unknown as BridgeModule;\n\nexport interface BridgeModule {\n videoStreamToConfig(libav: unknown, stream: unknown): Promise<VideoDecoderConfig | null>;\n audioStreamToConfig(libav: unknown, stream: unknown): Promise<AudioDecoderConfig | null>;\n packetToEncodedVideoChunk(pkt: unknown, stream: unknown): EncodedVideoChunk;\n packetToEncodedAudioChunk(pkt: unknown, stream: unknown): EncodedAudioChunk;\n libavFrameToVideoFrame?(frame: unknown, stream: unknown): VideoFrame | null;\n}\n"]}
1
+ {"version":3,"sources":["../src/strategies/fallback/libav-import.ts"],"names":["bridge"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,IAAM,WAAA,GAA4BA","file":"libav-import-2ZVKV2E7.cjs","sourcesContent":["/**\n * Static-import wrapper for the libavjs-webcodecs-bridge optional peer dep.\n *\n * The variant itself is **not** imported here — it's loaded via a runtime\n * dynamic import with `/* @vite-ignore *\\/` from `libav-loader.ts`, so the\n * variant's `.mjs` file is never touched by Vite's transform pipeline (which\n * would otherwise pre-bundle it and break the `import.meta.url`-based path\n * resolution it uses to find its sibling .wasm files).\n *\n * The bridge has no such issue — it's pure JS and doesn't reference sibling\n * binaries — so a normal static import is fine here.\n *\n * TypeScript resolves `libavjs-webcodecs-bridge` via the `paths` mapping in\n * tsconfig.json which redirects to `src/libav-stubs.d.ts`, sidestepping the\n * polyfill source files that don't typecheck under TS 5.7.\n */\nimport * as bridge from \"libavjs-webcodecs-bridge\";\n\nexport const libavBridge: BridgeModule = bridge as unknown as BridgeModule;\n\nexport interface BridgeModule {\n videoStreamToConfig(libav: unknown, stream: unknown): Promise<VideoDecoderConfig | null>;\n audioStreamToConfig(libav: unknown, stream: unknown): Promise<AudioDecoderConfig | null>;\n packetToEncodedVideoChunk(pkt: unknown, stream: unknown): EncodedVideoChunk;\n packetToEncodedAudioChunk(pkt: unknown, stream: unknown): EncodedAudioChunk;\n /**\n * Convert a libav-decoded frame (software OR hardware decode) into a\n * WebCodecs VideoFrame. `opts.timeBase` overrides the frame's per-packet\n * timebase; useful when callers have already normalized pts to µs.\n */\n laFrameToVideoFrame(\n frame: unknown,\n opts?: { timeBase?: [number, number]; transfer?: boolean },\n ): VideoFrame;\n}\n"]}
@@ -4,5 +4,5 @@ import * as bridge from 'libavjs-webcodecs-bridge';
4
4
  var libavBridge = bridge;
5
5
 
6
6
  export { libavBridge };
7
- //# sourceMappingURL=libav-import-2JURFHEW.js.map
8
- //# sourceMappingURL=libav-import-2JURFHEW.js.map
7
+ //# sourceMappingURL=libav-import-6MGLCXVQ.js.map
8
+ //# sourceMappingURL=libav-import-6MGLCXVQ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/strategies/fallback/libav-import.ts"],"names":[],"mappings":";;;AAkBO,IAAM,WAAA,GAA4B","file":"libav-import-2JURFHEW.js","sourcesContent":["/**\n * Static-import wrapper for the libavjs-webcodecs-bridge optional peer dep.\n *\n * The variant itself is **not** imported here — it's loaded via a runtime\n * dynamic import with `/* @vite-ignore *\\/` from `libav-loader.ts`, so the\n * variant's `.mjs` file is never touched by Vite's transform pipeline (which\n * would otherwise pre-bundle it and break the `import.meta.url`-based path\n * resolution it uses to find its sibling .wasm files).\n *\n * The bridge has no such issue — it's pure JS and doesn't reference sibling\n * binaries — so a normal static import is fine here.\n *\n * TypeScript resolves `libavjs-webcodecs-bridge` via the `paths` mapping in\n * tsconfig.json which redirects to `src/libav-stubs.d.ts`, sidestepping the\n * polyfill source files that don't typecheck under TS 5.7.\n */\nimport * as bridge from \"libavjs-webcodecs-bridge\";\n\nexport const libavBridge: BridgeModule = bridge as unknown as BridgeModule;\n\nexport interface BridgeModule {\n videoStreamToConfig(libav: unknown, stream: unknown): Promise<VideoDecoderConfig | null>;\n audioStreamToConfig(libav: unknown, stream: unknown): Promise<AudioDecoderConfig | null>;\n packetToEncodedVideoChunk(pkt: unknown, stream: unknown): EncodedVideoChunk;\n packetToEncodedAudioChunk(pkt: unknown, stream: unknown): EncodedAudioChunk;\n libavFrameToVideoFrame?(frame: unknown, stream: unknown): VideoFrame | null;\n}\n"]}
1
+ {"version":3,"sources":["../src/strategies/fallback/libav-import.ts"],"names":[],"mappings":";;;AAkBO,IAAM,WAAA,GAA4B","file":"libav-import-6MGLCXVQ.js","sourcesContent":["/**\n * Static-import wrapper for the libavjs-webcodecs-bridge optional peer dep.\n *\n * The variant itself is **not** imported here — it's loaded via a runtime\n * dynamic import with `/* @vite-ignore *\\/` from `libav-loader.ts`, so the\n * variant's `.mjs` file is never touched by Vite's transform pipeline (which\n * would otherwise pre-bundle it and break the `import.meta.url`-based path\n * resolution it uses to find its sibling .wasm files).\n *\n * The bridge has no such issue — it's pure JS and doesn't reference sibling\n * binaries — so a normal static import is fine here.\n *\n * TypeScript resolves `libavjs-webcodecs-bridge` via the `paths` mapping in\n * tsconfig.json which redirects to `src/libav-stubs.d.ts`, sidestepping the\n * polyfill source files that don't typecheck under TS 5.7.\n */\nimport * as bridge from \"libavjs-webcodecs-bridge\";\n\nexport const libavBridge: BridgeModule = bridge as unknown as BridgeModule;\n\nexport interface BridgeModule {\n videoStreamToConfig(libav: unknown, stream: unknown): Promise<VideoDecoderConfig | null>;\n audioStreamToConfig(libav: unknown, stream: unknown): Promise<AudioDecoderConfig | null>;\n packetToEncodedVideoChunk(pkt: unknown, stream: unknown): EncodedVideoChunk;\n packetToEncodedAudioChunk(pkt: unknown, stream: unknown): EncodedAudioChunk;\n /**\n * Convert a libav-decoded frame (software OR hardware decode) into a\n * WebCodecs VideoFrame. `opts.timeBase` overrides the frame's per-packet\n * timebase; useful when callers have already normalized pts to µs.\n */\n laFrameToVideoFrame(\n frame: unknown,\n opts?: { timeBase?: [number, number]; transfer?: boolean },\n ): VideoFrame;\n}\n"]}