# `Membrane.MP4.Container`
[🔗](https://github.com/membraneframework/membrane_mp4_plugin/blob/v0.36.10/lib/membrane_mp4/container.ex#L1)

Module for parsing and serializing MP4 files.

Bases on MP4 structure specification from `Membrane.MP4.Container.Schema`.

# `box_name_t`

```elixir
@type box_name_t() :: atom()
```

# `field_name_t`

```elixir
@type field_name_t() :: atom()
```

# `fields_t`

```elixir
@type fields_t() :: %{required(field_name_t()) =&gt; term() | [term()] | fields_t()}
```

# `parse_error_context_t`

```elixir
@type parse_error_context_t() :: [
  box: box_name_t(),
  field: field_name_t(),
  data: bitstring(),
  reason:
    :box_header
    | {:box_size, header: pos_integer(), actual: pos_integer()}
    | {:non_empty_leftover, binary()}
]
```

# `serialize_error_context_t`

```elixir
@type serialize_error_context_t() :: [box: box_name_t(), field: field_name_t()]
```

# `t`

```elixir
@type t() :: [
  {box_name_t(), %{content: binary()} | %{fields: fields_t(), children: t()}}
]
```

# `box_path`

```elixir
@spec box_path(box_name_t() | [box_name_t()]) :: [atom()]
```

Maps a path in the MP4 box tree into sequence of keys under which that
box resides in MP4.

# `get_box`

```elixir
@spec get_box(t(), box_name_t() | [box_name_t()]) :: t()
```

Gets a box from a given path in a parsed MP4.

# `parse`

```elixir
@spec parse(binary()) ::
  {:ok, t(), leftover :: binary()} | {:error, parse_error_context_t()}
```

Parses binary data to MP4 according to `Membrane.MP4.Container.Schema.Default.schema/0`.

Returns boxes that have been correctly parsed, and the leftover data that
is insufficient to constitute a complete box.

# `parse`

```elixir
@spec parse(binary(), Membrane.MP4.Container.Schema.t()) ::
  {:ok, t(), leftover :: binary()} | {:error, parse_error_context_t()}
```

Parses binary data to MP4 according to a custom schema.

Returns boxes that have been correctly parsed, and the leftover data that
is insufficient to constitute a complete box.

# `parse!`

```elixir
@spec parse!(binary()) :: {t(), leftover :: binary()}
```

Same as `parse/1`, raises on error.

# `parse!`

```elixir
@spec parse!(binary(), Membrane.MP4.Container.Schema.t()) ::
  {t(), leftover :: binary()}
```

Same as `parse/2`, raises on error.

# `serialize`

```elixir
@spec serialize(t()) :: {:ok, binary()} | {:error, serialize_error_context_t()}
```

Serializes MP4 to a binary according to `Membrane.MP4.Container.Schema.Default.schema/0`.

# `serialize`

```elixir
@spec serialize(t(), Membrane.MP4.Container.Schema.t()) ::
  {:ok, binary()} | {:error, serialize_error_context_t()}
```

Serializes MP4 to a binary according to a custom schema.

# `serialize!`

```elixir
@spec serialize!(t()) :: binary()
```

Same as `serialize/1`, raises on error

# `serialize!`

```elixir
@spec serialize!(t(), Membrane.MP4.Container.Schema.t()) :: binary()
```

Same as `serialize/2`, raises on error

# `update_box`

```elixir
@spec update_box(t(), box_name_t() | [box_name_t()], [atom()], (term() -&gt; term())) ::
  t()
```

Updates a box at a given path in a parsed MP4.

If `parameter_path` is set, a parameter within a box is updated.

---

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