@@ -8,6 +8,7 @@ defmodule ExRTMP.Server.ClientSession do
88 require Logger
99
1010 alias ExRTMP.ChunkParser
11+ alias ExRTMP.Client.MediaProcessor
1112 alias ExRTMP.Message
1213 alias ExRTMP.Message.Command.NetConnection
1314 alias ExRTMP.Message.Command.NetConnection . { CreateStream , Response }
@@ -27,14 +28,16 @@ defmodule ExRTMP.Server.ClientSession do
2728 handler_mod: module ( ) ,
2829 handler_state: any ( ) ,
2930 state: state ( ) ,
30- stream_id: non_neg_integer ( ) | nil
31+ stream_id: non_neg_integer ( ) | nil ,
32+ media_processor: MediaProcessor . t ( ) | nil
3133 }
3234
3335 @ enforce_keys [ :socket ]
3436 defstruct @ enforce_keys ++
3537 [
3638 :handler_mod ,
3739 :handler_state ,
40+ :media_processor ,
3841 chunk_parser: ChunkParser . new ( ) ,
3942 state: :init ,
4043 stream_id: nil
@@ -78,7 +81,8 @@ defmodule ExRTMP.Server.ClientSession do
7881 state = % State {
7982 handler_mod: handler_mod ,
8083 handler_state: handler_mod . init ( options [ :handler_options ] ) ,
81- socket: options [ :socket ]
84+ socket: options [ :socket ] ,
85+ media_processor: if ( options [ :demux ] , do: MediaProcessor . new ( ) )
8286 }
8387
8488 { :ok , state , { :continue , :handshake } }
@@ -176,7 +180,7 @@ defmodule ExRTMP.Server.ClientSession do
176180 state
177181 end
178182
179- defp handle_message ( % { type: 8 } = message , % { state: :publishing } = state ) do
183+ defp handle_message ( % { type: 8 } = message , % { state: :publishing , media_processor: nil } = state ) do
180184 handler_state =
181185 state . handler_mod . handle_audio_data (
182186 message . timestamp ,
@@ -187,7 +191,17 @@ defmodule ExRTMP.Server.ClientSession do
187191 % { state | handler_state: handler_state }
188192 end
189193
190- defp handle_message ( % { type: 9 } = message , % { state: :publishing } = state ) do
194+ defp handle_message ( % { type: 8 } = message , % { state: :publishing } = state ) do
195+ { media , processor } = MediaProcessor . push_audio ( message , state . media_processor )
196+ mod = state . handler_mod
197+
198+ handler_state =
199+ Enum . reduce ( List . wrap ( media ) , state . handler_state , & mod . handle_audio_data ( 0 , & 1 , & 2 ) )
200+
201+ % { state | handler_state: handler_state , media_processor: processor }
202+ end
203+
204+ defp handle_message ( % { type: 9 } = message , % { state: :publishing , media_processor: nil } = state ) do
191205 handler_state =
192206 state . handler_mod . handle_video_data (
193207 message . timestamp ,
@@ -198,6 +212,16 @@ defmodule ExRTMP.Server.ClientSession do
198212 % { state | handler_state: handler_state }
199213 end
200214
215+ defp handle_message ( % { type: 9 } = message , % { state: :publishing } = state ) do
216+ { media , processor } = MediaProcessor . push_video ( message , state . media_processor )
217+ mod = state . handler_mod
218+
219+ handler_state =
220+ Enum . reduce ( List . wrap ( media ) , state . handler_state , & mod . handle_video_data ( 0 , & 1 , & 2 ) )
221+
222+ % { state | handler_state: handler_state , media_processor: processor }
223+ end
224+
201225 defp handle_message ( % { type: type } , state ) when type == 8 or type == 9 , do: state
202226
203227 defp handle_message ( % { type: 18 , payload: % Metadata { data: data } } , state ) do
0 commit comments