Skip to content

Commit 3eb806f

Browse files
committed
add FU-A start constraint
1 parent aeea29d commit 3eb806f

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

lib/ex_webrtc/rtp/h264/nal_formats/fu.ex

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,24 @@ defmodule ExWebRTC.RTP.H264.FU do
7070

7171
defp do_parse(header, packet, acc)
7272

73-
defp do_parse(%FU.Header{start_bit: true}, packet, acc),
74-
do: {:incomplete, %__MODULE__{acc | data: [packet]}}
73+
defp do_parse(%FU.Header{start_bit: true}, data, %{data: []} = acc),
74+
do: {:incomplete, %__MODULE__{acc | data: [data]}}
75+
76+
defp do_parse(%FU.Header{start_bit: true}, _data, _acc),
77+
do: {:error, :last_fu_not_finished}
7578

7679
defp do_parse(%FU.Header{start_bit: false}, _data, %__MODULE__{data: []}),
7780
do: {:error, :invalid_first_packet}
7881

79-
defp do_parse(%FU.Header{end_bit: true, type: type}, packet, %__MODULE__{data: acc_data}) do
82+
defp do_parse(%FU.Header{end_bit: true, type: type}, data, %__MODULE__{data: acc_data}) do
8083
result =
81-
[packet | acc_data]
84+
[data | acc_data]
8285
|> Enum.reverse()
8386
|> Enum.join()
8487

8588
{:ok, {result, type}}
8689
end
8790

88-
defp do_parse(_header, packet, %__MODULE__{data: acc_data} = fu),
89-
do: {:incomplete, %__MODULE__{fu | data: [packet | acc_data]}}
91+
defp do_parse(_header, data, %__MODULE__{data: acc_data} = fu),
92+
do: {:incomplete, %__MODULE__{fu | data: [data | acc_data]}}
9093
end

test/ex_webrtc/rtp/h264/depayloader_test.exs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,26 @@ defmodule ExWebRTC.RTP.H264.DepayloaderTest do
7171
{bin, depayloader}
7272
end
7373

74+
test "Check starting new without ending previous FU-A" do
75+
payload_fuas = <<60, 133, 128>>
76+
payload_fua = <<60, 133, 129>>
77+
78+
depayloader = Depayloader.H264.new()
79+
80+
packet1 = ExRTP.Packet.new(payload_fuas, timestamp: 10)
81+
packet2 = ExRTP.Packet.new(payload_fua, timestamp: 10)
82+
83+
{bin, depayloader} = Depayloader.H264.depayload(depayloader, packet1)
84+
85+
assert {nil, %{current_timestamp: 10, fu_parser_acc: %{data: [<<128>>]}}} =
86+
{bin, depayloader}
87+
88+
{bin, depayloader} = Depayloader.H264.depayload(depayloader, packet2)
89+
90+
assert {nil, %{current_timestamp: nil, fu_parser_acc: nil}} =
91+
{bin, depayloader}
92+
end
93+
7494
test "Check all reserved NAL types" do
7595
# reserved NALu types (22, 23, 30, 31)
7696
payloads_nalu_reserved = [<<55, 131>>, <<56, 131>>, <<62, 131>>, <<63, 131>>]

0 commit comments

Comments
 (0)