# `ExSDP.Attribute.FMTP`
[🔗](https://github.com/membraneframework/ex_sdp/blob/v1.2.0/lib/ex_sdp/attribute/fmtp.ex#L1)

This module represents fmtp (RFC 5576).

Parameters for:

* H264 (not all, RFC 6184),
* H265 (not all, RFC 7798)
* VP8, VP9, OPUS (RFC 7587)
* AV1 (no RFC, https://aomediacodec.github.io/av1-rtp-spec/)
* RTX (RFC 4588)
* FLEXFEC (RFC 8627)
* Telephone Events (RFC 4733)
* RED (RFC 2198)
* G.722.1 (RFC 5577)
* AAC (RFC 3640)
are currently supported.

# `attr_key`

```elixir
@type attr_key() :: :fmtp
```

Key that can be used for searching this attribute using `ExSDP.Media.get_attribute/2`.

# `reason`

```elixir
@type reason() ::
  :invalid_fmtp
  | :invalid_ps
  | :invalid_pt
  | :invalid_sprop_parameter_sets
  | :string_nan
  | :string_not_hex
  | :string_not_0_nor_1
```

Reason of parsing failure.

# `t`

```elixir
@type t() :: %ExSDP.Attribute.FMTP{
  apt: ExSDP.Attribute.RTPMapping.payload_type_t() | nil,
  auxillarydatasizelength: non_neg_integer() | nil,
  bitrate: non_neg_integer() | nil,
  cbr: boolean() | nil,
  config: binary() | nil,
  constantduration: non_neg_integer() | nil,
  constantsize: non_neg_integer() | nil,
  ctsdeltalength: non_neg_integer() | nil,
  de_interleavebuffersize: non_neg_integer() | nil,
  dtmf_tones: String.t() | nil,
  dtsdeltalength: non_neg_integer() | nil,
  indexdeltalength: non_neg_integer() | nil,
  indexlength: non_neg_integer() | nil,
  interop_constraints: non_neg_integer() | nil,
  level_asymmetry_allowed: boolean() | nil,
  level_id: non_neg_integer() | nil,
  level_idx: non_neg_integer() | nil,
  max_br: non_neg_integer() | nil,
  max_dpb: non_neg_integer() | nil,
  max_fr: non_neg_integer() | nil,
  max_fs: non_neg_integer() | nil,
  max_mbps: non_neg_integer() | nil,
  max_smbps: non_neg_integer() | nil,
  maxaveragebitrate: non_neg_integer() | nil,
  maxdisplacement: non_neg_integer() | nil,
  maxplaybackrate: non_neg_integer() | nil,
  maxptime: non_neg_integer() | nil,
  minptime: non_neg_integer() | nil,
  mode: :generic | :CELP_cbr | :CELP_vbr | :AAC_lbr | :AAC_hbr | nil,
  objecttype: non_neg_integer() | nil,
  packetization_mode: non_neg_integer() | nil,
  profile: non_neg_integer() | nil,
  profile_id: non_neg_integer() | nil,
  profile_level_id: non_neg_integer() | nil,
  profile_space: non_neg_integer() | nil,
  pt: term(),
  ptime: non_neg_integer() | nil,
  randomaccessindication: boolean() | nil,
  redundant_payloads: [ExSDP.Attribute.RTPMapping.payload_type_t()] | nil,
  repair_window: non_neg_integer() | nil,
  rtx_time: non_neg_integer() | nil,
  sizelength: non_neg_integer() | nil,
  sprop_maxcapturerate: non_neg_integer() | nil,
  sprop_parameter_sets: %{sps: binary(), pps: binary()} | nil,
  sprop_pps: [binary()] | nil,
  sprop_sps: [binary()] | nil,
  sprop_vps: [binary()] | nil,
  stereo: boolean() | nil,
  streamstateindication: non_neg_integer() | nil,
  streamtype: non_neg_integer() | nil,
  tier: non_neg_integer() | nil,
  tier_flag: non_neg_integer() | nil,
  unknown: [String.t()],
  usedtx: boolean() | nil,
  useinbandfec: boolean() | nil
}
```

# `parse`

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

---

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