View Source ExRTP.Packet (ex_rtp v0.4.0)
RTP packet encoding and decoding functionalities.
Examples
iex> alias ExRTP.Packet
iex> alias ExRTP.Packet.Extension.AudioLevel
iex> extension = AudioLevel.new(true, 120) |> AudioLevel.to_raw(5)
iex> payload = <<3, 5, 5, 0>>
iex> encoded =
...> payload
...> |> Packet.new(
...> payload_type: 120,
...> sequence_number: 50_000,
...> timestamp: 1_000_000,
...> ssrc: 500_000
...> )
...> |> Packet.add_extension(extension)
...> |> Packet.encode()
iex> {:ok, %Packet{payload: ^payload}} = Packet.decode(encoded)
Summary
Functions
Adds RTP header extension (RFC 8285, multiple extensions per packet) to this packet.
Decodes binary into an RTP packet.
Encodes an RTP packet and returns resulting binary.
Fetches extension with specified id from this packet.
Creates new ExRTP.Packet.t/0 struct.
Removes all RTP header extension with specified ID, if there's any.
Removes RTP header extensions form this packet.
Sets RTP header extension (RFC 3550, one extension per packet) for this packet.
Types
@type t() :: %ExRTP.Packet{ csrc: [uint32()], extension: boolean(), extension_profile: uint16() | nil, extensions: [ExRTP.Packet.Extension.t()] | binary() | nil, marker: boolean(), padding: boolean(), padding_size: uint8(), payload: binary(), payload_type: uint7(), sequence_number: uint16(), ssrc: uint32(), timestamp: uint32(), version: 0..3 }
Struct representing an RTP packet.
Use new/2 to create a new RTP packet. RTP header extensions and packet
padding should not be modified directly, but with the use of functions in this module.
@type uint7() :: 0..127
@type uint8() :: 0..255
@type uint16() :: 0..65535
@type uint32() :: 0..4_294_967_295
Functions
@spec add_extension(t(), ExRTP.Packet.Extension.t()) :: t()
Adds RTP header extension (RFC 8285, multiple extensions per packet) to this packet.
If you want to use the traditional RTP extension mechanism (one extension per packet),
see set_extension/3.
Note that:
- if this packet already has the traditional extension (
RFC 3550, one extension per packet) set, it will be removed, - if the packet contained the
RFC 8285extensions, this function will append the new extension without removing previous extensions.
This function automatically decides whether to use "one byte" or "two byte" extension mechanism
(see RFC 8285, sec. 4) based on the extension data size and its id:
- if sizes of all of the extension are in range
1..16, and the IDs are in range1..14, "one byte" mechanism is used, - if there is an extension with size in range
17..255or equal to0, or with ID in range15..255, "two byte" mechanism is used, - otherwise, the extension is invalid and this function will raise.
Decodes binary into an RTP packet.
If RTP header extension is not used, extensions and extension_profile fields in the returned struct will be nil.
Otherwise, extensions will be:
- a
list, if the general mechanism for RTP header extension fromRFC 8285is used, - a
binary, if this is a traditional header extension as defined inRFC 3550
If the binary is too short to be valid, this function will return error with :not_enough_data.
Encodes an RTP packet and returns resulting binary.
@spec fetch_extension(t(), non_neg_integer()) :: {:ok, ExRTP.Packet.Extension.t()} | :error
Fetches extension with specified id from this packet.
If no extension with id is found or RFC 8285 extension mechanism is not used, this function will return :error.
@spec new(binary(), payload_type: uint7(), sequence_number: uint16(), timestamp: uint32(), ssrc: uint32(), csrc: [uint32()], marker: boolean(), padding: uint8() ) :: t()
Creates new ExRTP.Packet.t/0 struct.
The fields parameter corresponds to the RTP packet header fields.
Refer to RFC 3550 for in-depth explanation.
If not passed, payload_type, sequence_number, timestamp and
ssrc will be set to 0, as they are often expected to be set later
during the processing of the packet.
The fields keyword list may also include:
csrc(by default[], must be shorter than16),marker(by defaultfalse),padding(by default no padding is applied)
@spec remove_extension(t(), non_neg_integer()) :: t()
Removes all RTP header extension with specified ID, if there's any.
This function works only works for RFC 8285 extensions, for the
RFC 3550 extension use remove_extensions/1 instead.
Removes RTP header extensions form this packet.
Sets RTP header extension (RFC 3550, one extension per packet) for this packet.
If you want to use the general extension mechanism from RFC 8285 (multiple extensions per packet),
see add_extension/2.
Note that:
- this function will overwrite any extensions set beforehand,
- extension must be no longer than
262_140bytes and its length must be a multiple of4bytes, - profile value must not be
0xBEDEor0x1000.