Skip to content

Commit d6600a7

Browse files
authored
Send RTMP messages to client handler (#103)
* Rename handle_rtmp_message callback into handle_metadata. Invoke this callback only for specific messages that contain metadata
1 parent 39f8186 commit d6600a7

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

lib/membrane_rtmp_plugin/rtmp_server/client_handler.ex

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)