Skip to content

Commit

Permalink
Stop using no_return RTSP functions (#12)
Browse files Browse the repository at this point in the history
* Stop using no_return RTSP functions

* Bump version

* Use released membrane_rtsp
  • Loading branch information
Noarkhh authored Oct 1, 2024
1 parent bc32983 commit 25ceaf9
Show file tree
Hide file tree
Showing 7 changed files with 17 additions and 52 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Add the following line to your deps in `mix.exs`:
```elixir
def deps do
[
{:membrane_rtsp_plugin, "~> 0.3.0"}
{:membrane_rtsp_plugin, "~> 0.4.0"}
]
end
```
Expand Down
22 changes: 3 additions & 19 deletions lib/membrane_rtsp_plugin/source/connection_manager.ex
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ defmodule Membrane.RTSP.Source.ConnectionManager do
end

@spec play(State.t()) :: State.t()
def play(%State{transport: {:udp, _, _}} = state) do
def play(state) do
Membrane.Logger.debug("ConnectionManager: Setting RTSP on play mode")

case RTSP.play(state.rtsp_session) do
Expand All @@ -58,24 +58,11 @@ defmodule Membrane.RTSP.Source.ConnectionManager do
end
end

def play(%State{transport: :tcp} = state) do
Membrane.Logger.debug("ConnectionManager: Setting RTSP on play mode")

RTSP.play_no_response(state.rtsp_session)
%{state | keep_alive_timer: start_keep_alive_timer(state)}
end

@spec keep_alive(State.t()) :: State.t()
def keep_alive(state) do
Membrane.Logger.debug("Send GET_PARAMETER to keep session alive")

case state.transport do
:tcp ->
RTSP.get_parameter_no_response(state.rtsp_session)

{:udp, _port_range_start, _port_range_end} ->
{:ok, %{status: 200}} = RTSP.get_parameter(state.rtsp_session)
end
{:ok, %{status: 200}} = RTSP.get_parameter(state.rtsp_session)

%{state | keep_alive_timer: start_keep_alive_timer(state)}
end
Expand All @@ -95,17 +82,14 @@ defmodule Membrane.RTSP.Source.ConnectionManager do
end

@spec get_rtsp_description(State.t()) :: connection_establishment_phase_return()
defp get_rtsp_description(%{rtsp_session: rtsp_session} = state, retry \\ true) do
defp get_rtsp_description(%{rtsp_session: rtsp_session} = state) do
Membrane.Logger.debug("ConnectionManager: Getting RTSP description")

case RTSP.describe(rtsp_session, @content_type_header) do
{:ok, %{status: 200} = response} ->
tracks = get_tracks(response, state.allowed_media_types)
{:ok, %{state | tracks: tracks}}

{:ok, %{status: 401}} ->
if retry, do: get_rtsp_description(state, false), else: {:error, :unauthorized, state}

_result ->
{:error, :getting_rtsp_description_failed, state}
end
Expand Down
30 changes: 5 additions & 25 deletions lib/membrane_rtsp_plugin/tcp_decapsulator.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ defmodule Membrane.RTSP.TCP.Decapsulator do
RFC 7826 Section 14.
Encapsulated RTP packets interleaved in the stream will have the following structure:
["$" = 36 :: 1 byte][Channel id :: 1 byte][Length :: 2 bytes][packet :: <Length> bytes]
("$" = 36 :: 1 byte)(Channel id :: 1 byte)(Length :: 2 bytes)(packet :: <Length> bytes)
RTSP Messages are not encapsulated this way, but can only be present between RTP packets.
"""
Expand All @@ -14,12 +14,10 @@ defmodule Membrane.RTSP.TCP.Decapsulator do
alias Membrane.{Buffer, RemoteStream, RTP, RTSP}

def_options rtsp_session: [
spec: pid() | nil,
default: nil,
spec: pid(),
description: """
PID of a RTSP Session (returned from Membrane.RTSP.start or Membrane.RTSP.start_link)
that received RTSP responses will be forwarded to. If nil the responses will be
discarded.
that received RTSP responses will be forwarded to.
"""
]

Expand Down Expand Up @@ -94,7 +92,7 @@ defmodule Membrane.RTSP.TCP.Decapsulator do
) do
case RTSP.Response.verify_content_length(rtsp_message_start) do
{:ok, _expected_length, _actual_length} ->
handle_rtsp_response(rtsp_session, rtsp_message_start)
RTSP.handle_response(rtsp_session, rtsp_message_start)

{<<>>, complete_packets_binaries}

Expand All @@ -105,30 +103,12 @@ defmodule Membrane.RTSP.TCP.Decapsulator do
<<rtsp_message::binary-size(rtsp_message_length)-unit(8), rest::binary>> =
rtsp_message_start

handle_rtsp_response(rtsp_session, rtsp_message)
RTSP.handle_response(rtsp_session, rtsp_message)

get_complete_packets(rest, rtsp_session, complete_packets_binaries)

{:error, expected_length, actual_length} when actual_length <= expected_length ->
{rtsp_message_start, Enum.reverse(complete_packets_binaries)}
end
end

@spec handle_rtsp_response(RTSP.t() | nil, binary()) :: :ok | {:error, reason :: atom()}
defp handle_rtsp_response(nil, _response) do
:ok
end

defp handle_rtsp_response(session, response) do
case RTSP.handle_response(session, response) do
{:ok, %RTSP.Response{status: 200}} ->
:ok

{:ok, %RTSP.Response{status: 401}} ->
RTSP.get_parameter_no_response(session)

{:error, reason} ->
{:error, reason}
end
end
end
4 changes: 2 additions & 2 deletions mix.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
defmodule Membrane.RTSP.Plugin.Mixfile do
use Mix.Project

@version "0.3.0"
@version "0.4.0"
@github_url "https://github.com/gBillal/membrane_rtsp_plugin"

def project do
Expand Down Expand Up @@ -37,7 +37,7 @@ defmodule Membrane.RTSP.Plugin.Mixfile do
defp deps do
[
{:membrane_core, "~> 1.1"},
{:membrane_rtsp, "~> 0.9.0"},
{:membrane_rtsp, "~> 0.10.0"},
{:membrane_rtp_plugin, "~> 0.29.0"},
{:membrane_rtp_h264_plugin, "~> 0.19.0"},
{:membrane_rtp_h265_plugin, "~> 0.5.1"},
Expand Down
7 changes: 4 additions & 3 deletions mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@
"elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"},
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
"ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"},
"ex_sdp": {:hex, :ex_sdp, "0.17.0", "4c50e7814f01f149c0ccf258fba8428f8567dffecf1c416ec3f6aaaac607a161", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "c7fe0625902be2a835b5fe6834a189f7db7639d2625c8e9d8b3564e6d704145f"},
"ex_sdp": {:hex, :ex_sdp, "1.0.0", "c66cd66d60ad03ff1eecdc6db6a1b8a7b89fec260fcc22e8d6703fc5bbf430a3", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "e165dff988b8ab9d93588636aa5f3f683e1f848fc63b78b12382c8fa3dd39216"},
"file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"},
"ham": {:hex, :ham, "0.3.0", "7cd031b4a55fba219c11553e7b13ba73bd86eab4034518445eff1e038cb9a44d", [:mix], [], "hexpm", "7d6c6b73d7a6a83233876cc1b06a4d9b5de05562b228effda4532f9a49852bf6"},
"heap": {:hex, :heap, "2.0.2", "d98cb178286cfeb5edbcf17785e2d20af73ca57b5a2cf4af584118afbcf917eb", [:mix], [], "hexpm", "ba9ea2fe99eb4bcbd9a8a28eaf71cbcac449ca1d8e71731596aace9028c9d429"},
"jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},
"logger_backends": {:hex, :logger_backends, "1.0.0", "09c4fad6202e08cb0fbd37f328282f16539aca380f512523ce9472b28edc6bdf", [:mix], [], "hexpm", "1faceb3e7ec3ef66a8f5746c5afd020e63996df6fd4eb8cdb789e5665ae6c9ce"},
Expand All @@ -27,11 +28,11 @@
"membrane_rtp_h264_plugin": {:hex, :membrane_rtp_h264_plugin, "0.19.2", "de3eeaf35052f9f709d469fa7630d9ecc8f5787019f7072516eae1fd881bc792", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.0", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_rtp_format, "~> 0.8.0", [hex: :membrane_rtp_format, repo: "hexpm", optional: false]}], "hexpm", "d298e9cd471ab3601366c48ca0fec84135966707500152bbfcf3f968700647ae"},
"membrane_rtp_h265_plugin": {:hex, :membrane_rtp_h265_plugin, "0.5.1", "1e72309e340eaae5fce04f47b7b563accd563ab10bac139596626f0f0b4c72af", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_rtp_format, "~> 0.8.0", [hex: :membrane_rtp_format, repo: "hexpm", optional: false]}], "hexpm", "283d4b1b0271719f300b3bad4e05bef4db1cf3190f87291785e3f973106a1476"},
"membrane_rtp_plugin": {:hex, :membrane_rtp_plugin, "0.29.0", "0277310eb599b8e6de9e0b864807f23b3b245865e39a28f0cbab695d1f2c157e", [:mix], [{:bimap, "~> 1.2", [hex: :bimap, repo: "hexpm", optional: false]}, {:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_libsrtp, "~> 0.6.0 or ~> 0.7.0", [hex: :ex_libsrtp, repo: "hexpm", optional: true]}, {:heap, "~> 2.0.2", [hex: :heap, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_funnel_plugin, "~> 0.9.0", [hex: :membrane_funnel_plugin, repo: "hexpm", optional: false]}, {:membrane_rtp_format, "~> 0.8.0", [hex: :membrane_rtp_format, repo: "hexpm", optional: false]}, {:membrane_telemetry_metrics, "~> 0.1.0", [hex: :membrane_telemetry_metrics, repo: "hexpm", optional: false]}, {:qex, "~> 0.5.1", [hex: :qex, repo: "hexpm", optional: false]}], "hexpm", "1b3fd808114e06332b6a4e000238998a9188d1ef625c414ca3239aee70f0775d"},
"membrane_rtsp": {:hex, :membrane_rtsp, "0.9.0", "6232f716bdf128b9893bc8302d6d81a0374eef2f114a65bf0eafcdb8d681a98f", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.17.0", [hex: :ex_sdp, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3", [hex: :mockery, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.4.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "b1c4c91dd38b3c4c41f39c7ba025c892e6c85a23eabd1a5e2bdc6f555cbc39e9"},
"membrane_rtsp": {:hex, :membrane_rtsp, "0.10.0", "c65169b20243e7f8c296f16ce670dfcf1a5bcae0f24cfcc75f9235b606f29e06", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.17.0 or ~> 1.0", [hex: :ex_sdp, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3", [hex: :mockery, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.4.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7add88599836168f6d2c1ffa280da3d30378ba512189709403ae56d49736780e"},
"membrane_tcp_plugin": {:hex, :membrane_tcp_plugin, "0.6.0", "1f8dba5525504fb2d49070932f24113d1b26c7e5429c700671ed80433ac83f2f", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "820440f5a8181a96cff461ad2d5ed426d47eacfdd7764dd9596dad68ad892d3d"},
"membrane_telemetry_metrics": {:hex, :membrane_telemetry_metrics, "0.1.0", "cb93d28356b436b0597736c3e4153738d82d2a14ff547f831df7e9051e54fc06", [:mix], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.1", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "aba28dc8311f70ced95d984509be930fac55857d2d18bffcf768815e627be3f0"},
"membrane_udp_plugin": {:hex, :membrane_udp_plugin, "0.14.0", "d533ee5f6fcdd0551ad690045cdb6c1a76307a155d9255cc4a4606f85774bc37", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "902d1a7aa228ec377482d53a605b100e20e0b6e59196f94f94147bb62b23c47e"},
"mimic": {:hex, :mimic, "1.9.0", "c96367749a884556718f64657a4bdc99ce0cb5d19333aa04308fbd061c31b8b7", [:mix], [], "hexpm", "92107697938490b300566317c2a1490ef52e23aeac16632c0e56740721189116"},
"mimic": {:hex, :mimic, "1.10.1", "c1e3b2044483ffa54d9e61e3be439528f47022548f6d8db1f22ca7db5490e4fa", [:mix], [{:ham, "~> 0.2", [hex: :ham, repo: "hexpm", optional: false]}], "hexpm", "b31ac70e0d6f5877af03004f02632b4fbc6abe71ed95a47d87b68d3dfffb83b5"},
"mockery": {:hex, :mockery, "2.3.3", "3dba87bd0422a513e6af6e0d811383f38f82ac6be5d3d285a5fcca9c299bd0ac", [:mix], [], "hexpm", "17282be00613286254298117cd25e607a39f15ac03b41c631f60e52f5b5ec974"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"numbers": {:hex, :numbers, "5.2.4", "f123d5bb7f6acc366f8f445e10a32bd403c8469bdbce8ce049e1f0972b607080", [:mix], [{:coerce, "~> 1.0", [hex: :coerce, repo: "hexpm", optional: false]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "eeccf5c61d5f4922198395bf87a465b6f980b8b862dd22d28198c5e6fab38582"},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ defmodule Membrane.RTSP.Source.ConnectionManagerTest do

expect(RTSP.setup(^pid, _control, _headers), [num_calls: 3], do: {:ok, Response.new(200)})
expect(RTSP.get_socket(^pid), do: :socket)
expect(RTSP.play(^pid), do: {:ok, Response.new(200)})

assert state = ConnectionManager.establish_connection(state)

Expand All @@ -65,7 +66,6 @@ defmodule Membrane.RTSP.Source.ConnectionManagerTest do
expect(RTSP.start_link(@stream_uri, _options), do: {:error, :econnrefused})
expect(RTSP.start_link(@stream_uri, _options), do: {:ok, pid})

expect(RTSP.describe(^pid, [{"accept", "application/sdp"}]), do: {:ok, Response.new(401)})
expect(RTSP.describe(^pid, [{"accept", "application/sdp"}]), do: {:ok, Response.new(404)})

assert_raise RuntimeError,
Expand Down
2 changes: 1 addition & 1 deletion test/membrane_rtsp_plugin/tcp_decapsulator_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ defmodule Membrane.RTSP.DecapsulatorTest do
child(:source, %Source{
output: tcp_segments
})
|> child(:decapsulator, Decapsulator)
|> child(:decapsulator, %Decapsulator{rtsp_session: self()})
|> child(:sink, Sink)
)

Expand Down

0 comments on commit 25ceaf9

Please sign in to comment.