{"version":3,"sources":["../src/util/libav-demux.ts"],"names":["pickLibavVariant","loadLibav","prepareLibavInput","us"],"mappings":"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","file":"chunk-HZUVMXBN.cjs","sourcesContent":["/**\n * Shared libav demux session. Opens a libav demuxer over a NormalizedSource\n * and provides a linear, cancellable packet pump.\n *\n * Phase 1 API: deliberately minimal. The first consumer is the AVI/ASF/FLV\n * transcode path (src/convert/transcode-libav.ts), which is strictly linear.\n * No seek, no track swapping — those were added to hybrid/fallback's\n * private pumps for playback reasons. When those paths migrate here, the\n * API will grow to cover their needs.\n *\n * The shared timestamp sanitizers (sanitizePacketTimestamp,\n * sanitizeFrameTimestamp) also live here. They were previously duplicated\n * in convert/remux.ts and strategies/hybrid/decoder.ts. The duplicates\n * stay put in Phase 1 with TODO pointers; migration is a follow-up.\n */\n\nimport { loadLibav, type LibavVariant } from \"../strategies/fallback/libav-loader.js\";\nimport { pickLibavVariant } from \"../strategies/fallback/variant-routing.js\";\nimport { prepareLibavInput } from \"./libav-http-reader.js\";\nimport type { MediaContext, TransportConfig } from \"../types.js\";\nimport type { NormalizedSource } from \"./source.js\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Structural types (mirror libav.js' shape without dragging in its types)\n// ─────────────────────────────────────────────────────────────────────────\n\nexport interface 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\nexport interface 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\nexport interface LibavFrame {\n  data: unknown;\n  format: number;\n  channels?: number;\n  ch_layout_nb_channels?: number;\n  sample_rate?: number;\n  nb_samples?: number;\n  pts?: number;\n  ptshi?: number;\n  width?: number;\n  height?: 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  f64toi64?(val: number): [number, number];\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Session\n// ─────────────────────────────────────────────────────────────────────────\n\nexport interface LibavDemuxSession {\n  readonly libav: LibavRuntime;\n  readonly fmtCtx: number;\n  readonly streams: LibavStream[];\n  readonly videoStream: LibavStream | null;\n  readonly audioStream: LibavStream | null;\n  /** True when the input is being streamed via HTTP Range requests. */\n  readonly transport: \"http-range\" | \"blob\";\n  /**\n   * Linear read-to-EOF pump. Invokes the callbacks for each\n   * ff_read_frame_multi batch (audio is handed over before video per\n   * batch, matching the audio-first ordering that the hybrid/fallback\n   * playback pumps use — see POSTMORTEMS.md entry 1).\n   *\n   * Honors the AbortSignal between batches. Invokes `onEof` once when\n   * the demuxer returns EOF. Does NOT handle seek.\n   */\n  pump(cb: {\n    onVideoPackets?: (pkts: LibavPacket[]) => Promise<void>;\n    onAudioPackets?: (pkts: LibavPacket[]) => Promise<void>;\n    onEof?: () => Promise<void>;\n    signal?: AbortSignal;\n  }): Promise<void>;\n  destroy(): Promise<void>;\n}\n\nexport interface OpenLibavDemuxOptions {\n  source: NormalizedSource;\n  filename: string;\n  context: MediaContext;\n  transport?: TransportConfig;\n  /** Override automatic variant picking. Defaults to pickLibavVariant(context). */\n  variant?: LibavVariant;\n}\n\nexport async function openLibavDemux(opts: OpenLibavDemuxOptions): Promise<LibavDemuxSession> {\n  const variant: LibavVariant = opts.variant ?? pickLibavVariant(opts.context);\n  const libav = (await loadLibav(variant)) as unknown as LibavRuntime;\n\n  const inputHandle = await prepareLibavInput(\n    libav as unknown as Parameters<typeof prepareLibavInput>[0],\n    opts.filename,\n    opts.source,\n    opts.transport,\n  );\n\n  const readPkt = await libav.av_packet_alloc();\n  const [fmtCtx, streams] = await libav.ff_init_demuxer_file(opts.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  let destroyed = false;\n\n  async function pump(cb: Parameters<LibavDemuxSession[\"pump\"]>[0]): Promise<void> {\n    while (!destroyed) {\n      if (cb.signal?.aborted) return;\n\n      let readErr: number;\n      let packets: Record<number, LibavPacket[]>;\n      try {\n        [readErr, packets] = await libav.ff_read_frame_multi(fmtCtx, readPkt, {\n          // 16 KB batch — chosen so each read produces a handful of\n          // packets, keeping downstream queues bounded. Same rationale\n          // as the hybrid/fallback pumps (see CLAUDE.md note).\n          limit: 16 * 1024,\n        });\n      } catch (err) {\n        throw new Error(`libav-demux: ff_read_frame_multi failed: ${(err as Error).message}`);\n      }\n\n      if (destroyed || cb.signal?.aborted) return;\n\n      const videoPackets = videoStream ? packets[videoStream.index] : undefined;\n      const audioPackets = audioStream ? packets[audioStream.index] : undefined;\n\n      // Audio-first ordering. Audio decode is cheap; video decode can\n      // be expensive. Feeding audio first ensures the audio consumer\n      // has samples to work with before any long video-decode block.\n      if (cb.onAudioPackets && audioPackets && audioPackets.length > 0) {\n        await cb.onAudioPackets(audioPackets);\n      }\n      if (destroyed || cb.signal?.aborted) return;\n      if (cb.onVideoPackets && videoPackets && videoPackets.length > 0) {\n        await cb.onVideoPackets(videoPackets);\n      }\n\n      if (readErr === libav.AVERROR_EOF) {\n        if (cb.onEof) await cb.onEof();\n        return;\n      }\n      if (readErr && readErr !== 0 && readErr !== -libav.EAGAIN) {\n        throw new Error(`libav-demux: ff_read_frame_multi returned ${readErr}`);\n      }\n    }\n  }\n\n  async function destroy(): Promise<void> {\n    destroyed = true;\n    try { await libav.av_packet_free?.(readPkt); } catch { /* ignore */ }\n    try { await libav.avformat_close_input_js(fmtCtx); } catch { /* ignore */ }\n    try { await inputHandle.detach(); } catch { /* ignore */ }\n  }\n\n  return {\n    libav,\n    fmtCtx,\n    streams,\n    videoStream,\n    audioStream,\n    transport: inputHandle.transport,\n    pump,\n    destroy,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Timestamp sanitizers (extracted from convert/remux.ts + hybrid/decoder.ts)\n//\n// libav can hand us packets/frames with pts = AV_NOPTS_VALUE (encoded as\n// ptshi = -2147483648, pts = 0) for inputs whose demuxer can't determine\n// presentation times. AVI is the canonical example. Downstream consumers\n// that treat pts as int64 overflow and throw.\n//\n// The sanitizer replaces invalid pts with a synthetic microsecond counter,\n// and normalizes valid pts to a 1/1e6 time_base so consumers don't need\n// to track the source time_base per packet.\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Sanitize a libav packet's timestamp. Mutates `pkt` in place.\n * If the packet has AV_NOPTS_VALUE, replaces pts with `nextUs()`.\n * Otherwise normalizes to µs with time_base = 1/1_000_000.\n */\nexport function 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/**\n * Convert a raw libav packet's pts to seconds using the given stream\n * time_base, or return `null` if the packet lacks a valid pts. Used by\n * the hybrid + fallback strategies to track the demuxer's read-ahead\n * progress (the signal behind `<video>.buffered` on canvas strategies).\n *\n * Separate from `sanitizePacketTimestamp` — sanitization mutates the\n * packet and happens right before decoder feed; this peeks at the\n * timestamp earlier in the pump so we can track buffered extent without\n * perturbing the decode path.\n */\nexport function packetPtsSec(\n  pkt: Pick<LibavPacket, \"pts\" | \"ptshi\">,\n  timeBase: [number, number] | undefined,\n): number | null {\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) return null;\n  const tb = timeBase ?? [1, 1_000_000];\n  if (!tb[0] || !tb[1]) return null;\n  const pts64 = hi * 0x100000000 + lo;\n  const sec = (pts64 * tb[0]) / tb[1];\n  return Number.isFinite(sec) ? sec : null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Audio frame → interleaved Float32 (extracted from\n// strategies/hybrid/decoder.ts + strategies/fallback/decoder.ts).\n//\n// libav hands us decoded audio frames in whichever sample format the codec\n// uses (FLTP, S16P, etc.). Most downstream consumers (Web Audio, WebCodecs\n// AudioEncoder) want interleaved Float32. This does the conversion without\n// any dependencies.\n// ─────────────────────────────────────────────────────────────────────────\n\nconst AV_SAMPLE_FMT_U8 = 0;\nconst AV_SAMPLE_FMT_S16 = 1;\nconst AV_SAMPLE_FMT_S32 = 2;\nconst AV_SAMPLE_FMT_FLT = 3;\nconst AV_SAMPLE_FMT_U8P = 5;\nconst AV_SAMPLE_FMT_S16P = 6;\nconst AV_SAMPLE_FMT_S32P = 7;\nconst AV_SAMPLE_FMT_FLTP = 8;\n\nexport interface InterleavedSamples {\n  data: Float32Array;\n  channels: number;\n  sampleRate: number;\n}\n\nexport function libavFrameToInterleavedFloat32(frame: LibavFrame): InterleavedSamples | null {\n  const channels = frame.channels ?? frame.ch_layout_nb_channels ?? 1;\n  const sampleRate = frame.sample_rate ?? 44100;\n  const nbSamples = frame.nb_samples ?? 0;\n  if (nbSamples === 0) return null;\n\n  const out = new Float32Array(nbSamples * channels);\n\n  switch (frame.format) {\n    case AV_SAMPLE_FMT_FLTP: {\n      const planes = ensurePlanes(frame.data, channels);\n      for (let ch = 0; ch < channels; ch++) {\n        const plane = asFloat32(planes[ch]);\n        for (let i = 0; i < nbSamples; i++) out[i * channels + ch] = plane[i];\n      }\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_FLT: {\n      const flat = asFloat32(frame.data);\n      for (let i = 0; i < nbSamples * channels; i++) out[i] = flat[i];\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_S16P: {\n      const planes = ensurePlanes(frame.data, channels);\n      for (let ch = 0; ch < channels; ch++) {\n        const plane = asInt16(planes[ch]);\n        for (let i = 0; i < nbSamples; i++) out[i * channels + ch] = plane[i] / 32768;\n      }\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_S16: {\n      const flat = asInt16(frame.data);\n      for (let i = 0; i < nbSamples * channels; i++) out[i] = flat[i] / 32768;\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_S32P: {\n      const planes = ensurePlanes(frame.data, channels);\n      for (let ch = 0; ch < channels; ch++) {\n        const plane = asInt32(planes[ch]);\n        for (let i = 0; i < nbSamples; i++) out[i * channels + ch] = plane[i] / 2147483648;\n      }\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_S32: {\n      const flat = asInt32(frame.data);\n      for (let i = 0; i < nbSamples * channels; i++) out[i] = flat[i] / 2147483648;\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_U8P: {\n      const planes = ensurePlanes(frame.data, channels);\n      for (let ch = 0; ch < channels; ch++) {\n        const plane = asUint8(planes[ch]);\n        for (let i = 0; i < nbSamples; i++) out[i * channels + ch] = (plane[i] - 128) / 128;\n      }\n      return { data: out, channels, sampleRate };\n    }\n    case AV_SAMPLE_FMT_U8: {\n      const flat = asUint8(frame.data);\n      for (let i = 0; i < nbSamples * channels; i++) out[i] = (flat[i] - 128) / 128;\n      return { data: out, channels, sampleRate };\n    }\n    default:\n      return null;\n  }\n}\n\nfunction ensurePlanes(data: unknown, channels: number): unknown[] {\n  if (Array.isArray(data)) return data;\n  const arr = data as { length: number; subarray?: (a: number, b: number) => unknown };\n  const len = arr.length;\n  const perChannel = Math.floor(len / channels);\n  const planes: unknown[] = [];\n  for (let ch = 0; ch < channels; ch++) {\n    planes.push(arr.subarray ? arr.subarray(ch * perChannel, (ch + 1) * perChannel) : arr);\n  }\n  return planes;\n}\n\nfunction asFloat32(x: unknown): Float32Array {\n  if (x instanceof Float32Array) return x;\n  const ta = x as { buffer: ArrayBuffer; byteOffset: number; byteLength: number };\n  return new Float32Array(ta.buffer, ta.byteOffset, ta.byteLength / 4);\n}\nfunction asInt16(x: unknown): Int16Array {\n  if (x instanceof Int16Array) return x;\n  const ta = x as { buffer: ArrayBuffer; byteOffset: number; byteLength: number };\n  return new Int16Array(ta.buffer, ta.byteOffset, ta.byteLength / 2);\n}\nfunction asInt32(x: unknown): Int32Array {\n  if (x instanceof Int32Array) return x;\n  const ta = x as { buffer: ArrayBuffer; byteOffset: number; byteLength: number };\n  return new Int32Array(ta.buffer, ta.byteOffset, ta.byteLength / 4);\n}\nfunction asUint8(x: unknown): Uint8Array {\n  if (x instanceof Uint8Array) return x;\n  const ta = x as { buffer: ArrayBuffer; byteOffset: number; byteLength: number };\n  return new Uint8Array(ta.buffer, ta.byteOffset, ta.byteLength);\n}\n\n/**\n * Sanitize a decoded frame's timestamp. Mutates `frame` in place.\n * Returns nothing; callers that want derived metadata (e.g. a\n * VideoFrame timestamp in µs) should read `frame.pts` after calling.\n */\nexport function sanitizeFrameTimestamp(\n  frame: LibavFrame,\n  nextUs: () => number,\n  fallbackTimeBase?: [number, number],\n): void {\n  const lo = frame.pts ?? 0;\n  const hi = frame.ptshi ?? 0;\n  const isInvalid = (hi === -2147483648 && lo === 0) || !Number.isFinite(lo);\n  if (isInvalid) {\n    const us = nextUs();\n    frame.pts = us;\n    frame.ptshi = 0;\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    frame.pts = us;\n    frame.ptshi = us < 0 ? -1 : 0;\n    return;\n  }\n  const fallback = nextUs();\n  frame.pts = fallback;\n  frame.ptshi = 0;\n}\n"]}