Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sending RTCP Reports #81

Merged
merged 10 commits into from
Mar 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions examples/echo/mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
"elixir_make": {:hex, :elixir_make, "0.7.8", "505026f266552ee5aabca0b9f9c229cbb496c689537c9f922f3eb5431157efc7", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "7a71945b913d37ea89b06966e1342c85cfe549b15e6d6d081e8081c493062c07"},
"elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"},
"ex_dtls": {:hex, :ex_dtls, "0.15.1", "34b3600ff13eebf6c96be033005cc110ea5beef98394631365ec26b493df80c5", [:mix], [{:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "9cfebdfe9111c0f68c77667cb9366e4a6f17e8a240975ffd100148de57478a29"},
"ex_ice": {:hex, :ex_ice, "0.6.1", "6e28c38a750c36e8ecea359bcff8c88ed47be036d7b217f376480eccd1d2ed08", [:mix], [{:ex_stun, "~> 0.1.0", [hex: :ex_stun, repo: "hexpm", optional: false]}], "hexpm", "cdc5d0199930c2be66c473b7a60d4786c63d23a624f7f52a2b08c3ea059669fe"},
"ex_ice": {:git, "https://github.com/elixir-webrtc/ex_ice.git", "3d98186bac257e671e4fabaf930729c3299adea7", []},
"ex_libsrtp": {:hex, :ex_libsrtp, "0.7.2", "211bd89c08026943ce71f3e2c0231795b99cee748808ed3ae7b97cd8d2450b6b", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.3", [hex: :bundlex, repo: "hexpm", optional: false]}, {:membrane_precompiled_dependency_provider, "~> 0.1.0", [hex: :membrane_precompiled_dependency_provider, repo: "hexpm", optional: false]}, {:unifex, "~> 1.1", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "2e20645d0d739a4ecdcf8d4810a0c198120c8a2f617f2b75b2e2e704d59f492a"},
"ex_rtcp": {:hex, :ex_rtcp, "0.2.0", "7599506340835d5e879ca04c6e90b25c56340ffedd4d345c14b1c0fc858446c9", [:mix], [], "hexpm", "5a5b47a2549bd2ae0bb03ec87f166f561c031ff6c8bbe189bde1e68e8578a99f"},
"ex_rtp": {:hex, :ex_rtp, "0.3.0", "d18d0de39875958902816284f79c8cd51ec83d39bdd14edf6a5b069926268a43", [:mix], [], "hexpm", "cec8398237095b02438842cfc74487c3cbaeb7fe29e4c62ae11457a0ddd99754"},
"ex_sdp": {:hex, :ex_sdp, "0.14.1", "3c49b0a39c919713a3691a5c0637954680e3ad9aec6f87dc9e5a01978a32124a", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "a4d6637b8eda59f218368a677caecffc054f6fc3228bedf17aeb6bfa8a58a6ed"},
"ex_sdp": {:hex, :ex_sdp, "0.15.0", "53815fb5b5e4fae0f3b26de90f372446bb8e0eed62a3cc20394d3c29519698be", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "d3f23596b73e7057521ff0f0d55b1189c6320a2f04388aa3a80a0aa97ffb379f"},
"ex_stun": {:hex, :ex_stun, "0.1.0", "252474bf4c8519fbf4bc0fbfc6a1b846a634b1478c65dbbfb4b6ab4e33c2a95a", [:mix], [], "hexpm", "629fc8be45b624a92522f81d85ba001877b1f0745889a2419bdb678790d7480c"},
"finch": {:hex, :finch, "0.17.0", "17d06e1d44d891d20dbd437335eebe844e2426a0cd7e3a3e220b461127c73f70", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8d014a661bb6a437263d4b5abf0bcbd3cf0deb26b1e8596f2a271d22e48934c7"},
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
Expand Down
4 changes: 2 additions & 2 deletions examples/save_to_file/mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
"elixir_make": {:hex, :elixir_make, "0.7.8", "505026f266552ee5aabca0b9f9c229cbb496c689537c9f922f3eb5431157efc7", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "7a71945b913d37ea89b06966e1342c85cfe549b15e6d6d081e8081c493062c07"},
"elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"},
"ex_dtls": {:hex, :ex_dtls, "0.15.1", "34b3600ff13eebf6c96be033005cc110ea5beef98394631365ec26b493df80c5", [:mix], [{:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "9cfebdfe9111c0f68c77667cb9366e4a6f17e8a240975ffd100148de57478a29"},
"ex_ice": {:hex, :ex_ice, "0.6.1", "6e28c38a750c36e8ecea359bcff8c88ed47be036d7b217f376480eccd1d2ed08", [:mix], [{:ex_stun, "~> 0.1.0", [hex: :ex_stun, repo: "hexpm", optional: false]}], "hexpm", "cdc5d0199930c2be66c473b7a60d4786c63d23a624f7f52a2b08c3ea059669fe"},
"ex_ice": {:git, "https://github.com/elixir-webrtc/ex_ice.git", "3d98186bac257e671e4fabaf930729c3299adea7", []},
"ex_libsrtp": {:hex, :ex_libsrtp, "0.7.2", "211bd89c08026943ce71f3e2c0231795b99cee748808ed3ae7b97cd8d2450b6b", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.3", [hex: :bundlex, repo: "hexpm", optional: false]}, {:membrane_precompiled_dependency_provider, "~> 0.1.0", [hex: :membrane_precompiled_dependency_provider, repo: "hexpm", optional: false]}, {:unifex, "~> 1.1", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "2e20645d0d739a4ecdcf8d4810a0c198120c8a2f617f2b75b2e2e704d59f492a"},
"ex_rtcp": {:hex, :ex_rtcp, "0.2.0", "7599506340835d5e879ca04c6e90b25c56340ffedd4d345c14b1c0fc858446c9", [:mix], [], "hexpm", "5a5b47a2549bd2ae0bb03ec87f166f561c031ff6c8bbe189bde1e68e8578a99f"},
"ex_rtp": {:hex, :ex_rtp, "0.3.0", "d18d0de39875958902816284f79c8cd51ec83d39bdd14edf6a5b069926268a43", [:mix], [], "hexpm", "cec8398237095b02438842cfc74487c3cbaeb7fe29e4c62ae11457a0ddd99754"},
"ex_sdp": {:hex, :ex_sdp, "0.14.1", "3c49b0a39c919713a3691a5c0637954680e3ad9aec6f87dc9e5a01978a32124a", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "a4d6637b8eda59f218368a677caecffc054f6fc3228bedf17aeb6bfa8a58a6ed"},
"ex_sdp": {:hex, :ex_sdp, "0.15.0", "53815fb5b5e4fae0f3b26de90f372446bb8e0eed62a3cc20394d3c29519698be", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "d3f23596b73e7057521ff0f0d55b1189c6320a2f04388aa3a80a0aa97ffb379f"},
"ex_stun": {:hex, :ex_stun, "0.1.0", "252474bf4c8519fbf4bc0fbfc6a1b846a634b1478c65dbbfb4b6ab4e33c2a95a", [:mix], [], "hexpm", "629fc8be45b624a92522f81d85ba001877b1f0745889a2419bdb678790d7480c"},
"finch": {:hex, :finch, "0.17.0", "17d06e1d44d891d20dbd437335eebe844e2426a0cd7e3a3e220b461127c73f70", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8d014a661bb6a437263d4b5abf0bcbd3cf0deb26b1e8596f2a271d22e48934c7"},
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
Expand Down
4 changes: 2 additions & 2 deletions examples/send_from_file/mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
"elixir_make": {:hex, :elixir_make, "0.7.8", "505026f266552ee5aabca0b9f9c229cbb496c689537c9f922f3eb5431157efc7", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "7a71945b913d37ea89b06966e1342c85cfe549b15e6d6d081e8081c493062c07"},
"elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"},
"ex_dtls": {:hex, :ex_dtls, "0.15.1", "34b3600ff13eebf6c96be033005cc110ea5beef98394631365ec26b493df80c5", [:mix], [{:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "9cfebdfe9111c0f68c77667cb9366e4a6f17e8a240975ffd100148de57478a29"},
"ex_ice": {:hex, :ex_ice, "0.6.1", "6e28c38a750c36e8ecea359bcff8c88ed47be036d7b217f376480eccd1d2ed08", [:mix], [{:ex_stun, "~> 0.1.0", [hex: :ex_stun, repo: "hexpm", optional: false]}], "hexpm", "cdc5d0199930c2be66c473b7a60d4786c63d23a624f7f52a2b08c3ea059669fe"},
"ex_ice": {:git, "https://github.com/elixir-webrtc/ex_ice.git", "3d98186bac257e671e4fabaf930729c3299adea7", []},
"ex_libsrtp": {:hex, :ex_libsrtp, "0.7.2", "211bd89c08026943ce71f3e2c0231795b99cee748808ed3ae7b97cd8d2450b6b", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.3", [hex: :bundlex, repo: "hexpm", optional: false]}, {:membrane_precompiled_dependency_provider, "~> 0.1.0", [hex: :membrane_precompiled_dependency_provider, repo: "hexpm", optional: false]}, {:unifex, "~> 1.1", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "2e20645d0d739a4ecdcf8d4810a0c198120c8a2f617f2b75b2e2e704d59f492a"},
"ex_rtcp": {:hex, :ex_rtcp, "0.2.0", "7599506340835d5e879ca04c6e90b25c56340ffedd4d345c14b1c0fc858446c9", [:mix], [], "hexpm", "5a5b47a2549bd2ae0bb03ec87f166f561c031ff6c8bbe189bde1e68e8578a99f"},
"ex_rtp": {:hex, :ex_rtp, "0.3.0", "d18d0de39875958902816284f79c8cd51ec83d39bdd14edf6a5b069926268a43", [:mix], [], "hexpm", "cec8398237095b02438842cfc74487c3cbaeb7fe29e4c62ae11457a0ddd99754"},
"ex_sdp": {:hex, :ex_sdp, "0.14.1", "3c49b0a39c919713a3691a5c0637954680e3ad9aec6f87dc9e5a01978a32124a", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "a4d6637b8eda59f218368a677caecffc054f6fc3228bedf17aeb6bfa8a58a6ed"},
"ex_sdp": {:hex, :ex_sdp, "0.15.0", "53815fb5b5e4fae0f3b26de90f372446bb8e0eed62a3cc20394d3c29519698be", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "d3f23596b73e7057521ff0f0d55b1189c6320a2f04388aa3a80a0aa97ffb379f"},
"ex_stun": {:hex, :ex_stun, "0.1.0", "252474bf4c8519fbf4bc0fbfc6a1b846a634b1478c65dbbfb4b6ab4e33c2a95a", [:mix], [], "hexpm", "629fc8be45b624a92522f81d85ba001877b1f0745889a2419bdb678790d7480c"},
"finch": {:hex, :finch, "0.17.0", "17d06e1d44d891d20dbd437335eebe844e2426a0cd7e3a3e220b461127c73f70", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8d014a661bb6a437263d4b5abf0bcbd3cf0deb26b1e8596f2a271d22e48934c7"},
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
Expand Down
62 changes: 56 additions & 6 deletions lib/ex_webrtc/peer_connection.ex
Original file line number Diff line number Diff line change
Expand Up @@ -769,10 +769,10 @@ defmodule ExWebRTC.PeerConnection do
{packet, state}
end

{packet, sender} = RTPSender.send(transceiver.sender, packet)
{packet, transceiver} = RTPTransceiver.send_packet(transceiver, packet)
:ok = DTLSTransport.send_rtp(state.dtls_transport, packet)

transceivers = List.update_at(state.transceivers, idx, &%{&1 | sender: sender})
transceivers = List.replace_at(state.transceivers, idx, transceiver)
state = %{state | transceivers: transceivers}

{:noreply, state}
Expand Down Expand Up @@ -853,8 +853,8 @@ defmodule ExWebRTC.PeerConnection do
_other -> twcc_recorder
end

receiver = RTPReceiver.recv(t.receiver, packet, data)
transceivers = List.update_at(state.transceivers, idx, &%{&1 | receiver: receiver})
t = RTPTransceiver.receive_packet(t, packet, byte_size(data))
transceivers = List.replace_at(state.transceivers, idx, t)

notify(state.owner, {:rtp, t.receiver.track.id, packet})

Expand All @@ -881,7 +881,13 @@ defmodule ExWebRTC.PeerConnection do
def handle_info({:dtls_transport, _pid, {:rtcp, data}}, state) do
case ExRTCP.CompoundPacket.decode(data) do
{:ok, packets} ->
transceivers =
Enum.reduce(packets, state.transceivers, fn packet, transceivers ->
handle_report(packet, transceivers)
end)

notify(state.owner, {:rtcp, packets})
{:noreply, %{state | transceivers: transceivers}}

{:error, _res} ->
case data do
Expand All @@ -891,9 +897,9 @@ defmodule ExWebRTC.PeerConnection do
_ ->
Logger.warning("Failed to decode RTCP packet, packet is too short")
end
end

{:noreply, state}
{:noreply, state}
end
end

@impl true
Expand All @@ -914,6 +920,32 @@ defmodule ExWebRTC.PeerConnection do
end
end

@impl true
def handle_info({:send_report, type, transceiver_id}, state) do
mickel8 marked this conversation as resolved.
Show resolved Hide resolved
transceiver =
state.transceivers
|> Enum.with_index()
|> Enum.find(fn {tr, _idx} -> tr.id == transceiver_id end)

transceivers =
case transceiver do
nil ->
state.transceivers

{tr, idx} ->
{report, tr} = RTPTransceiver.get_report(tr, type)

if report != nil do
encoded = ExRTCP.Packet.encode(report)
:ok = DTLSTransport.send_rtcp(state.dtls_transport, encoded)
end

List.replace_at(state.transceivers, idx, tr)
end

{:noreply, %{state | transceivers: transceivers}}
end

@impl true
def handle_info(msg, state) do
Logger.info("OTHER MSG #{inspect(msg)}")
Expand Down Expand Up @@ -1479,6 +1511,24 @@ defmodule ExWebRTC.PeerConnection do
end
end

defp handle_report(%ExRTCP.Packet.SenderReport{} = report, transceivers) do
transceiver =
transceivers
|> Enum.with_index()
|> Enum.find(fn {tr, _idx} -> tr.receiver.ssrc == report.ssrc end)

case transceiver do
nil ->
transceivers

{tr, idx} ->
tr = RTPTransceiver.receive_report(tr, report)
List.replace_at(transceivers, idx, tr)
end
end

defp handle_report(_report, transceivers), do: transceivers

defp do_get_description(nil, _candidates), do: nil

defp do_get_description({type, sdp}, candidates) do
Expand Down
72 changes: 65 additions & 7 deletions lib/ex_webrtc/rtp_receiver.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,89 @@ defmodule ExWebRTC.RTPReceiver do
Implementation of the [RTCRtpReceiver](https://www.w3.org/TR/webrtc/#rtcrtpreceiver-interface).
"""

alias ExWebRTC.{MediaStreamTrack, Utils}
require Logger

alias ExWebRTC.{MediaStreamTrack, Utils, RTPCodecParameters}
alias __MODULE__.ReportRecorder

@type t() :: %__MODULE__{
track: MediaStreamTrack.t(),
codec: RTPCodecParameters.t() | nil,
ssrc: non_neg_integer() | nil,
bytes_received: non_neg_integer(),
packets_received: non_neg_integer(),
markers_received: non_neg_integer()
markers_received: non_neg_integer(),
report_recorder: ReportRecorder.t()
}

defstruct [:track, :ssrc, bytes_received: 0, packets_received: 0, markers_received: 0]
@enforce_keys [:track, :codec, :report_recorder]
defstruct [
ssrc: nil,
bytes_received: 0,
packets_received: 0,
markers_received: 0
] ++ @enforce_keys

@doc false
@spec recv(t(), ExRTP.Packet.t(), binary()) :: t()
def recv(receiver, packet, raw_packet) do
@spec new(MediaStreamTrack.t(), RTPCodecParameters.t() | nil) :: t()
def new(track, codec) do
report_recorder = %ReportRecorder{
clock_rate: codec && codec.clock_rate
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Smart! Looks like optional 🤯

}

%__MODULE__{
track: track,
codec: codec,
report_recorder: report_recorder
}
end

@doc false
@spec update(t(), RTPCodecParameters.t() | nil) :: t()
def update(receiver, codec) do
report_recorder = %ReportRecorder{
receiver.report_recorder
| clock_rate: codec && codec.clock_rate
}

%__MODULE__{receiver | codec: codec, report_recorder: report_recorder}
end

@doc false
@spec receive_packet(t(), ExRTP.Packet.t(), non_neg_integer()) :: t()
def receive_packet(receiver, packet, size) do
if packet.payload_type != receiver.codec.payload_type do
Logger.warning("Received packet with unexpected payload_type
(received #{packet.payload_type}, expected #{receiver.codec.payload_type}")
end

report_recorder = ReportRecorder.record_packet(receiver.report_recorder, packet)

# TODO assign ssrc when applying local/remote description.
%__MODULE__{
receiver
| ssrc: packet.ssrc,
bytes_received: receiver.bytes_received + byte_size(raw_packet),
bytes_received: receiver.bytes_received + size,
packets_received: receiver.packets_received + 1,
markers_received: receiver.markers_received + Utils.to_int(packet.marker)
markers_received: receiver.markers_received + Utils.to_int(packet.marker),
report_recorder: report_recorder
}
end

@spec receive_report(t(), ExRTCP.Packet.SenderReport.t()) :: t()
def receive_report(receiver, report) do
report_recorder = ReportRecorder.record_report(receiver.report_recorder, report)

%__MODULE__{receiver | report_recorder: report_recorder}
end

@doc false
@spec update_sender_ssrc(t(), non_neg_integer()) :: t()
def update_sender_ssrc(receiver, ssrc) do
report_recorder = %ReportRecorder{receiver.report_recorder | sender_ssrc: ssrc}
%__MODULE__{receiver | report_recorder: report_recorder}
end

@doc false
@spec get_stats(t(), non_neg_integer()) :: map()
def get_stats(receiver, timestamp) do
Expand Down
Loading
Loading