{"version":3,"sources":["../src/strategies/remux/annexb.ts","../src/convert/remux.ts"],"names":["probe","avbridgeVideoToMediabunny","avbridgeAudioToMediabunny","buildMediabunnySourceFromInput","normalizeSource","prepareLibavInput","sanitizePacketTimestamp"],"mappings":"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","file":"chunk-E5MAM2P4.cjs","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 { sanitizePacketTimestamp } from \"../util/libav-demux.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// ── 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"]}