@@ -10,7 +10,7 @@ defmodule Membrane.RTMPServer.ClientHandler do
1010 use GenServer
1111
1212 require Logger
13- alias Membrane.RTMP . { Handshake , MessageHandler , MessageParser }
13+ alias Membrane.RTMP . { Handshake , MessageHandler , MessageParser , Messages }
1414
1515 @ typedoc """
1616 A type representing a module which implements `#{ inspect ( __MODULE__ ) } ` behaviour.
@@ -48,12 +48,30 @@ defmodule Membrane.RTMPServer.ClientHandler do
4848 """
4949 @ callback handle_connection_closed ( state :: state ( ) ) :: state ( )
5050
51+ @ doc """
52+ The optional callback invoked when the client handler receives RTMP message with
53+ metadata information (just like a resolution or a framerate of a video stream).
54+ The following messages are considered the ones that contain metadata:
55+ 1) OnMetaData
56+ 2) SetDataFrame
57+ """
58+ @ callback handle_metadata (
59+ { :metadata_message , Messages.OnMetaData . t ( ) | Messages.SetDataFrame . t ( ) } ,
60+ state ( )
61+ ) :: state ( )
62+
5163 @ doc """
5264 The callback invoked when the client handler receives a message
5365 that is not recognized as an internal message of the client handler.
5466 """
5567 @ callback handle_info ( msg :: term ( ) , state ( ) ) :: state ( )
5668
69+ @ optional_callbacks handle_metadata: 2
70+
71+ defguardp is_metadata_message ( message )
72+ when is_struct ( message , Messages.OnMetaData ) or
73+ is_struct ( message , Messages.SetDataFrame )
74+
5775 @ doc """
5876 Makes the client handler ask client for the desired number of buffers
5977 """
@@ -185,6 +203,24 @@ defmodule Membrane.RTMPServer.ClientHandler do
185203
186204 state = Enum . reduce ( events , state , & handle_event / 2 )
187205
206+ state =
207+ if state . notified_about_client? &&
208+ Kernel . function_exported? ( state . handler , :handle_metadata , 2 ) do
209+ new_handler_state =
210+ Enum . reduce ( messages , state . handler_state , fn
211+ { % Membrane.RTMP.Header { } , message } , handler_state
212+ when is_metadata_message ( message ) ->
213+ state . handler . handle_metadata ( { :metadata_message , message } , handler_state )
214+
215+ _other , handler_state ->
216+ handler_state
217+ end )
218+
219+ % { state | handler_state: new_handler_state }
220+ else
221+ state
222+ end
223+
188224 request_data ( state )
189225
190226 { :noreply ,
0 commit comments