Skip to content

Commit 3e73975

Browse files
committed
first working
1 parent 564fc30 commit 3e73975

File tree

5 files changed

+37
-30
lines changed

5 files changed

+37
-30
lines changed

lib/ex_webrtc/rtp/depayloader.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ defmodule ExWebRTC.RTP.Depayloader do
3636
defp to_depayloader_module(mime_type) do
3737
case String.downcase(mime_type) do
3838
"video/vp8" -> {:ok, ExWebRTC.RTP.Depayloader.VP8}
39+
"video/h264" -> {:ok, ExWebRTC.RTP.Depayloader.H264}
3940
"audio/opus" -> {:ok, ExWebRTC.RTP.Depayloader.Opus}
4041
"audio/pcma" -> {:ok, ExWebRTC.RTP.Depayloader.G711}
4142
"audio/pcmu" -> {:ok, ExWebRTC.RTP.Depayloader.G711}

lib/ex_webrtc/rtp/h264/depayloader.ex

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,20 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
1212

1313
alias ExWebRTC.RTP.H264.{FU, NAL, StapA}
1414

15-
@frame_prefix <<1::32>>
16-
@annexb_prefix <<1::4>>
17-
18-
defmodule State do
19-
@moduledoc false
20-
defstruct parser_acc: nil
21-
end
15+
@annexb_prefix <<1::32>>
2216

2317
@type t() :: %__MODULE__{
24-
current_nal: nil,
25-
current_timestamp: nil
18+
current_timestamp: nil,
19+
fu_parser_acc: nil
2620
}
2721

28-
defstruct [:current_nal, :current_timestamp]
22+
defstruct [:current_timestamp, :fu_parser_acc]
2923

3024
@impl true
3125
def new() do
3226
%__MODULE__{}
3327
end
3428

35-
# TODO: handle timestamps
3629
@impl true
3730
def depayload(depayloader, packet)
3831

@@ -41,8 +34,9 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
4134
def depayload(depayloader, packet) do
4235
with {:ok, {header, _payload} = nal} <- NAL.Header.parse_unit_header(packet.payload),
4336
unit_type = NAL.Header.decode_type(header),
44-
{:ok, {nalu, depayloader}} <- handle_unit_type(unit_type, depayloader, packet, nal) do
45-
{nalu, depayloader}
37+
{:ok, {nal, depayloader}} <-
38+
handle_unit_type(unit_type, depayloader, packet, nal) do
39+
{nal, depayloader}
4640
else
4741
{:error, reason} ->
4842
Logger.warning("""
@@ -54,18 +48,18 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
5448
end
5549
end
5650

57-
defp handle_unit_type(:single_nalu, _depayloader, _packet, nal) do
58-
{header, payload} = nal
59-
{:ok, {prefix_annexb(payload), depayloader}}
51+
defp handle_unit_type(:single_nalu, depayloader, packet, {_header, payload}) do
52+
{:ok,
53+
{prefix_annexb(payload), %__MODULE__{depayloader | current_timestamp: packet.timestamp}}}
6054
end
6155

6256
defp handle_unit_type(
6357
:fu_a,
64-
{current_nal, current_timestamp} = depayloader,
58+
%{current_timestamp: current_timestamp, fu_parser_acc: fu_parser_acc},
6559
packet,
66-
{header, payload} = nal
60+
{header, payload}
6761
) do
68-
if current_nal != nil and current_timestamp != packet.timestamp do
62+
if fu_parser_acc != nil and current_timestamp != packet.timestamp do
6963
{:error, "fu-a colliding rtp timestamps"}
7064

7165
Logger.debug("""
@@ -74,25 +68,37 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
7468
""")
7569
end
7670

77-
case FU.parse(payload, current_nal) do
78-
{:ok, {payload, type}} ->
79-
{:ok, result}
71+
case FU.parse(payload, fu_parser_acc || %FU{}) do
72+
{:ok, {data, type}} ->
73+
data = NAL.Header.add_header(data, 0, header.nal_ref_idc, type)
74+
75+
{:ok,
76+
{prefix_annexb(data),
77+
%__MODULE__{current_timestamp: packet.timestamp, fu_parser_acc: nil}}}
8078

81-
{:incomplete, tmp} ->
82-
{:ok, {nil, %{depayloader | current_nal: curent_nal <> tmp}}}
79+
{:incomplete, fu} ->
80+
{:ok, {nil, %__MODULE__{fu_parser_acc: fu}}}
8381

8482
{:error, _reason} = error ->
8583
error
8684
end
8785
end
8886

89-
defp handle_unit_type(:stap_a, depayloader, {_header, data}, buffer, state) do
90-
with {:ok, result} <- StapA.parse(data) do
87+
defp handle_unit_type(:stap_a, depayloader, packet, {_header, payload}) do
88+
with {:ok, result} <- StapA.parse(payload) do
9189
nals = Enum.reduce(result, <<>>, fn nal, acc -> acc <> prefix_annexb(nal) end)
92-
{:ok, {nals, depayloader}}
90+
{:ok, {nals, %__MODULE__{depayloader | current_timestamp: packet.timestamp}}}
9391
end
9492
end
9593

94+
defp handle_unit_type(unsupported_type, _depayloader, _packet, _nal) do
95+
{:error, "unsupported nal type #{unsupported_type}"}
96+
97+
Logger.debug("""
98+
Received packet with unsupported NAL type. Supported types are: NAL unit types, STAP-A, FU-A. Dropping packet.
99+
""")
100+
end
101+
96102
defp prefix_annexb(nal) do
97103
@annexb_prefix <> nal
98104
end

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule ExWebRTC.RTP.H264.FU do
44
"""
55
use Bunch
66
alias __MODULE__
7-
alias Membrane.RTP.H264.NAL
7+
alias ExWebRTC.RTP.H264.NAL
88

99
defstruct data: []
1010

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ defmodule ExWebRTC.RTP.H264.FU.Header do
1212
```
1313
"""
1414

15-
alias Membrane.RTP.H264.NAL
15+
alias ExWebRTC.RTP.H264.NAL
1616

1717
@typedoc """
1818
MUST be set to true only in the first packet in a sequence.

lib/ex_webrtc/rtp/h264/nal_header.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
defmodule ExWebRTC.RTP.H264.NALHeader do
1+
defmodule ExWebRTC.RTP.H264.NAL.Header do
22
@moduledoc """
33
Defines a structure representing Network Abstraction Layer Unit Header
44

0 commit comments

Comments
 (0)