Skip to content

Commit

Permalink
Add payload-specific PLI feedback packet type
Browse files Browse the repository at this point in the history
  • Loading branch information
LVala committed Mar 8, 2024
1 parent 6f4d33e commit b242e36
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/ex_rtcp/packet.ex
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ defmodule ExRTCP.Packet do
| __MODULE__.Goodbye.t()
| __MODULE__.TransportFeedback.NACK.t()
| __MODULE__.TransportFeedback.CC.t()
| __MODULE__.PayloadFeedback.PLI.t()
| __MODULE__.PayloadFeedback.FIR.t()

@typedoc """
Expand Down Expand Up @@ -91,6 +92,7 @@ defmodule ExRTCP.Packet do
defp get_type_module(203, _count), do: {:ok, __MODULE__.Goodbye}
defp get_type_module(205, 1), do: {:ok, __MODULE__.TransportFeedback.NACK}
defp get_type_module(205, 15), do: {:ok, __MODULE__.TransportFeedback.CC}
defp get_type_module(206, 1), do: {:ok, __MODULE__.PayloadFeedback.PLI}
defp get_type_module(206, 4), do: {:ok, __MODULE__.PayloadFeedback.FIR}
defp get_type_module(_type, _count), do: {:error, :unknown_type}
end
48 changes: 48 additions & 0 deletions lib/ex_rtcp/packet/payload_feedback/pli.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
defmodule ExRTCP.Packet.PayloadFeedback.PLI do
@moduledoc """
Payload-specific Picture Loss Indication (PLI)
packet type (`RFC 4585`, sec. 6.3.1).
"""

alias ExRTCP.Packet

@behaviour ExRTCP.PacketTranscoder

@packet_type 206
@feedback_type 1

@typedoc """
Struct representing Payload-specific PLI feedback RTCP message.
"""
@type t() :: %__MODULE__{
sender_ssrc: Packet.uint32(),
media_ssrc: Packet.uint32()
}

@enforce_keys [:sender_ssrc, :media_ssrc]
defstruct @enforce_keys

@impl true
def encode(packet) do
%__MODULE__{
sender_ssrc: sender_ssrc,
media_ssrc: media_ssrc
} = packet

encoded = <<sender_ssrc::32, media_ssrc::32>>

{encoded, @feedback_type, @packet_type}
end

@impl true
def decode(<<sender_ssrc::32, media_ssrc::32>>, _count) do
packet = %__MODULE__{
sender_ssrc: sender_ssrc,
media_ssrc: media_ssrc
}

{:ok, packet}
end

def decode(_raw, _count), do: {:error, :invalid_packet}
end
39 changes: 39 additions & 0 deletions test/ex_rtcp/packet/payload_feedback/pli_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
defmodule ExRTCP.Packet.PayloadFeedback.PLITest do
use ExUnit.Case, async: true

alias ExRTCP.Packet.PayloadFeedback.PLI

@sender_ssrc 123_321
@media_ssrc 112_231

test "encode/1" do
packet = %PLI{
sender_ssrc: @sender_ssrc,
media_ssrc: @media_ssrc
}

assert {encoded, 1, 206} = PLI.encode(packet)

assert <<@sender_ssrc::32, @media_ssrc::32>> == encoded
end

describe "decode/2" do
test "valid_packet" do
raw_packet = <<@sender_ssrc::32, @media_ssrc::32>>

assert {:ok, packet} = PLI.decode(raw_packet, 1)

assert %PLI{
sender_ssrc: @sender_ssrc,
media_ssrc: @media_ssrc
} = packet
end

test "invalid_packet" do
# packet cut short
raw_packet = <<@sender_ssrc::32, @media_ssrc::16>>

assert {:error, :invalid_packet} = PLI.decode(raw_packet, 1)
end
end
end

0 comments on commit b242e36

Please sign in to comment.