# `MOQX.Debug`
[🔗](https://github.com/dmorn/moqx/blob/main/lib/moqx/debug.ex#L1)

Debug helpers for inspecting raw MOQ frame payloads.

This module is intentionally low-level and focused on practical diagnostics,
especially for MP4/CMAF payloads that include a top-level `prft` box
(Producer Reference Time).

# `box_info`

```elixir
@type box_info() :: %{
  type: String.t(),
  size: pos_integer(),
  offset: non_neg_integer()
}
```

Top-level ISO BMFF box descriptor.

# `prft_info`

```elixir
@type prft_info() :: %{
  version: 0 | 1,
  flags: non_neg_integer(),
  reference_track_id: non_neg_integer(),
  ntp_timestamp: non_neg_integer(),
  publisher_unix_ms: integer(),
  media_time: non_neg_integer()
}
```

Parsed PRFT fields.

# `ntp_to_unix_ms`

```elixir
@spec ntp_to_unix_ms(non_neg_integer()) :: integer()
```

Converts a 64-bit NTP timestamp to Unix epoch milliseconds.

# `parse_prft`

```elixir
@spec parse_prft(binary()) :: {:ok, prft_info()} | {:error, String.t()}
```

Parses the first top-level `prft` box from a frame payload.

Returns `{:ok, prft_info}` or `{:error, reason}`.

# `publisher_age_ms`

```elixir
@spec publisher_age_ms(binary(), integer()) ::
  {:ok, non_neg_integer()} | {:error, String.t()}
```

Estimates publisher age (ms) from the first top-level `prft` box.

This computes `max(now_ms - publisher_unix_ms, 0)`.

# `top_level_boxes`

```elixir
@spec top_level_boxes(binary()) :: [box_info()]
```

Lists top-level ISO BMFF boxes in `payload`.

Returns best-effort parsed boxes and stops when encountering malformed or
incomplete trailing data.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
