@@ -6,7 +6,10 @@ defmodule Membrane.RTP.Demuxer do
6
6
"""
7
7
8
8
use Membrane.Filter
9
- alias Membrane . { RemoteStream , RTCP , RTP }
9
+ require Membrane.Pad
10
+
11
+ alias Membrane.Element.Action
12
+ alias Membrane . { Pad , RemoteStream , RTCP , RTP }
10
13
11
14
def_input_pad :input ,
12
15
accepted_format:
@@ -35,7 +38,7 @@ defmodule Membrane.RTP.Demuxer do
35
38
@ type t :: % __MODULE__ {
36
39
stream_states: % {
37
40
RTP . ssrc_t ( ) => % {
38
- waiting_packets : [ ExRTP.Packet . t ( ) ] ,
41
+ buffered_actions : [ Action . buffer ( ) | Action . end_of_stream ( ) ] ,
39
42
phase: :waiting_for_link | :linked
40
43
}
41
44
}
@@ -65,19 +68,27 @@ defmodule Membrane.RTP.Demuxer do
65
68
66
69
@ impl true
67
70
def handle_pad_added ( Pad . ref ( :output , ssrc ) = pad , _ctx , state ) do
68
- waiting_buffers =
69
- state . stream_states [ ssrc ] . waiting_packets
70
- |> Enum . reverse ( )
71
- |> Enum . map ( & put_packet_into_buffer / 1 )
71
+ buffered_actions = state . stream_states [ ssrc ] . buffered_actions
72
72
73
73
state =
74
74
Bunch.Struct . update_in (
75
75
state ,
76
76
[ :stream_states , ssrc ] ,
77
- & % { & 1 | phase: :linked , waiting_packets : [ ] }
77
+ & % { & 1 | phase: :linked , buffered_actions : [ ] }
78
78
)
79
79
80
- { [ stream_format: { pad , % RTP { } } , buffer: { pad , waiting_buffers } ] , state }
80
+ { [ stream_format: { pad , % RTP { } } ] ++ Enum . reverse ( buffered_actions ) , state }
81
+ end
82
+
83
+ @ impl true
84
+ def handle_end_of_stream ( :input , _ctx , state ) do
85
+ state =
86
+ state . stream_states
87
+ |> Enum . reduce ( state , fn { ssrc , _stream_state } , state ->
88
+ append_action_to_buffered_actions ( ssrc , { :end_of_stream , Pad . ref ( :output , ssrc ) } , state )
89
+ end )
90
+
91
+ { [ forward: :end_of_stream ] , state }
81
92
end
82
93
83
94
@ spec classify_packet ( binary ( ) ) :: :rtp | :rtcp
@@ -101,7 +112,12 @@ defmodule Membrane.RTP.Demuxer do
101
112
{ buffer_actions , state } =
102
113
case state . stream_states [ packet . ssrc ] . phase do
103
114
:waiting_for_link ->
104
- { [ ] , append_packet_to_waiting_packets ( packet , state ) }
115
+ { [ ] ,
116
+ append_action_to_buffered_actions (
117
+ packet . ssrc ,
118
+ { :buffer , { Pad . ref ( :output , packet . ssrc ) , put_packet_into_buffer ( packet ) } } ,
119
+ state
120
+ ) }
105
121
106
122
:linked ->
107
123
{ [ buffer: { Pad . ref ( :output , packet . ssrc ) , put_packet_into_buffer ( packet ) } ] , state }
@@ -118,7 +134,7 @@ defmodule Membrane.RTP.Demuxer do
118
134
@ spec initialize_new_stream_state ( ExRTP.Packet . t ( ) , State . t ( ) ) ::
119
135
{ [ Membrane.Element.Action . t ( ) ] , State . t ( ) }
120
136
defp initialize_new_stream_state ( packet , state ) do
121
- stream_state = % { waiting_packets : [ ] , phase: :waiting_for_link }
137
+ stream_state = % { buffered_actions : [ ] , phase: :waiting_for_link }
122
138
123
139
extensions =
124
140
case packet . extensions do
@@ -136,9 +152,13 @@ defmodule Membrane.RTP.Demuxer do
136
152
{ [ notify_parent: { :new_rtp_stream , packet . ssrc , packet . payload_type , extensions } ] , state }
137
153
end
138
154
139
- @ spec append_packet_to_waiting_packets ( ExRTP.Packet . t ( ) , State . t ( ) ) :: State . t ( )
140
- defp append_packet_to_waiting_packets ( packet , state ) do
141
- Bunch.Struct . update_in ( state , [ :stream_states , packet . ssrc , :waiting_packets ] , & [ packet | & 1 ] )
155
+ @ spec append_action_to_buffered_actions (
156
+ ExRTP.Packet . uint32 ( ) ,
157
+ Action . buffer ( ) | Action . end_of_stream ( ) ,
158
+ State . t ( )
159
+ ) :: State . t ( )
160
+ defp append_action_to_buffered_actions ( ssrc , action , state ) do
161
+ Bunch.Struct . update_in ( state , [ :stream_states , ssrc , :buffered_actions ] , & [ action | & 1 ] )
142
162
end
143
163
144
164
@ spec put_packet_into_buffer ( ExRTP.Packet . t ( ) ) :: Membrane.Buffer . t ( )
0 commit comments