@@ -16,6 +16,7 @@ defmodule ExRTMP.Server.ClientSession do
1616 alias ExRTMP.Message.Metadata
1717
1818 @ default_acknowledgement_size 3_000_000
19+ @ default_chunk_size 128
1920
2021 defmodule State do
2122 @ moduledoc false
@@ -29,7 +30,8 @@ defmodule ExRTMP.Server.ClientSession do
2930 handler_state: any ( ) ,
3031 state: state ( ) ,
3132 stream_id: non_neg_integer ( ) | nil ,
32- media_processor: MediaProcessor . t ( ) | nil
33+ media_processor: MediaProcessor . t ( ) | nil ,
34+ chunk_size: non_neg_integer ( )
3335 }
3436
3537 @ enforce_keys [ :socket ]
@@ -38,6 +40,7 @@ defmodule ExRTMP.Server.ClientSession do
3840 :handler_mod ,
3941 :handler_state ,
4042 :media_processor ,
43+ :chunk_size ,
4144 chunk_parser: ChunkParser . new ( ) ,
4245 state: :init ,
4346 stream_id: nil
@@ -87,7 +90,8 @@ defmodule ExRTMP.Server.ClientSession do
8790 handler_mod: handler_mod ,
8891 handler_state: handler_mod . init ( options [ :handler_options ] ) ,
8992 socket: options [ :socket ] ,
90- media_processor: if ( options [ :demux ] , do: MediaProcessor . new ( ) )
93+ media_processor: if ( options [ :demux ] , do: MediaProcessor . new ( ) ) ,
94+ chunk_size: options [ :chunk_size ] || @ default_chunk_size
9195 }
9296
9397 :ok =
@@ -105,6 +109,7 @@ defmodule ExRTMP.Server.ClientSession do
105109 case do_handle_handshake ( state . socket ) do
106110 :ok ->
107111 Logger . debug ( "RTMP Handshake successful" )
112+ set_chunk_size ( state . socket , state . chunk_size )
108113 { :ok , data } = :gen_tcp . recv ( state . socket , 0 )
109114 :ok = :inet . setopts ( state . socket , active: true )
110115 { :noreply , do_handle_data ( state , data ) }
@@ -116,15 +121,15 @@ defmodule ExRTMP.Server.ClientSession do
116121
117122 @ impl true
118123 def handle_cast ( { :video_data , timestamp , data } , state ) do
119- case send_media ( :video , state . socket , state . stream_id , timestamp , data ) do
124+ case send_media ( :video , timestamp , data , state ) do
120125 :ok -> { :noreply , state }
121126 { :error , reason } -> { :stop , reason , state }
122127 end
123128 end
124129
125130 @ impl true
126131 def handle_cast ( { :audio_data , timestamp , data } , state ) do
127- case send_media ( :audio , state . socket , state . stream_id , timestamp , data ) do
132+ case send_media ( :audio , timestamp , data , state ) do
128133 :ok -> { :noreply , state }
129134 { :error , reason } -> { :stop , reason , state }
130135 end
@@ -133,7 +138,7 @@ defmodule ExRTMP.Server.ClientSession do
133138 @ impl true
134139 def handle_cast ( { :metadata , data } , state ) do
135140 message = Message . metadata ( data , state . stream_id )
136- :ok = :gen_tcp . send ( state . socket , Message . serialize ( message ) )
141+ :ok = :gen_tcp . send ( state . socket , Message . serialize ( message , state . chunk_size ) )
137142 { :noreply , state }
138143 end
139144
@@ -173,6 +178,13 @@ defmodule ExRTMP.Server.ClientSession do
173178 end
174179 end
175180
181+ defp set_chunk_size ( _socket , @ default_chunk_size ) , do: :ok
182+
183+ defp set_chunk_size ( socket , chunk_size ) do
184+ message = Message . chunk_size ( chunk_size )
185+ :gen_tcp . send ( socket , Message . serialize ( message ) )
186+ end
187+
176188 defp do_handle_data ( state , data ) do
177189 { messages , parser } = ChunkParser . process ( data , state . chunk_parser )
178190 Enum . reduce ( messages , % { state | chunk_parser: parser } , & handle_message / 2 )
@@ -375,21 +387,24 @@ defmodule ExRTMP.Server.ClientSession do
375387 end
376388 end
377389
378- defp send_media ( media , socket , stream_id , timestamp , data ) do
390+ defp send_media ( media , timestamp , data , state ) do
379391 { type , chunk_stream_id } =
380392 case media do
381- :audio -> { 8 , stream_id * 3 }
382- :video -> { 9 , stream_id * 3 + 1 }
393+ :audio -> { 8 , state . stream_id * 3 }
394+ :video -> { 9 , state . stream_id * 3 + 1 }
383395 end
384396
385397 message = % Message {
386398 type: type ,
387399 timestamp: timestamp ,
388- stream_id: stream_id ,
400+ stream_id: state . stream_id ,
389401 payload: data
390402 }
391403
392- :gen_tcp . send ( socket , Message . serialize ( message , chunk_stream_id: chunk_stream_id ) )
404+ :gen_tcp . send (
405+ state . socket ,
406+ Message . serialize ( message , state . chunk_size , chunk_stream_id: chunk_stream_id )
407+ )
393408 end
394409
395410 defp send_messages ( state , [ ] ) , do: state
0 commit comments