From bf45f20e338553d7202917b55771079e37a39ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=9Aled=C5=BA?= Date: Thu, 18 Jan 2024 12:54:04 +0100 Subject: [PATCH] Fix no supported codecs scenario (#61) --- lib/ex_webrtc/peer_connection.ex | 21 ++++++--- .../peer_connection/configuration.ex | 14 +++--- lib/ex_webrtc/rtp_transceiver.ex | 17 ++++--- lib/ex_webrtc/sdp_utils.ex | 6 +-- mix.exs | 2 +- mix.lock | 22 +++++----- test/ex_webrtc/peer_connection_test.exs | 44 +++++++++++++++++++ test/ex_webrtc/sdp_utils_test.exs | 6 +-- 8 files changed, 93 insertions(+), 39 deletions(-) diff --git a/lib/ex_webrtc/peer_connection.ex b/lib/ex_webrtc/peer_connection.ex index 6906f85c..c381fea6 100644 --- a/lib/ex_webrtc/peer_connection.ex +++ b/lib/ex_webrtc/peer_connection.ex @@ -1005,6 +1005,13 @@ defmodule ExWebRTC.PeerConnection do end tr = %RTPTransceiver{tr | current_direction: direction, fired_direction: direction} + + # This is not defined in the W3C but see https://github.com/w3c/webrtc-pc/issues/2927 + tr = + if SDPUtils.rejected?(mline), + do: RTPTransceiver.stop(tr, on_track_ended(owner, tr.receiver.track.id)), + else: tr + transceivers = List.replace_at(transceivers, idx, tr) process_mlines_local(mlines, transceivers, :answer, owner) end @@ -1021,7 +1028,7 @@ defmodule ExWebRTC.PeerConnection do {:mid, mid} = ExSDP.get_attribute(mline, :mid) direction = - if SDPUtils.is_rejected(mline), + if SDPUtils.rejected?(mline), do: :inactive, else: SDPUtils.get_media_direction(mline) |> reverse_direction() @@ -1037,7 +1044,7 @@ defmodule ExWebRTC.PeerConnection do tr = if sdp_type == :answer, do: %RTPTransceiver{tr | current_direction: direction}, else: tr tr = - if SDPUtils.is_rejected(mline), + if SDPUtils.rejected?(mline), do: RTPTransceiver.stop(tr, on_track_ended(owner, tr.receiver.track.id)), else: tr @@ -1153,7 +1160,7 @@ defmodule ExWebRTC.PeerConnection do do: state defp update_negotiation_needed(state) do - negotiation_needed = is_negotiation_needed(state.transceivers, state) + negotiation_needed = negotiation_needed?(state.transceivers, state) cond do negotiation_needed == true and state.negotiation_needed == true -> @@ -1175,11 +1182,11 @@ defmodule ExWebRTC.PeerConnection do # We don't support MSIDs and stopping transceivers so # we only check 5.2 and 5.3 from 4.7.3#check-if-negotiation-is-needed # https://www.w3.org/TR/webrtc/#dfn-check-if-negotiation-is-needed - defp is_negotiation_needed([], _), do: false + defp negotiation_needed?([], _), do: false - defp is_negotiation_needed([tr | _transceivers], _state) when tr.mid == nil, do: true + defp negotiation_needed?([tr | _transceivers], _state) when tr.mid == nil, do: true - defp is_negotiation_needed([tr | transceivers], state) do + defp negotiation_needed?([tr | transceivers], state) do {local_desc_type, local_desc} = state.current_local_desc {_, remote_desc} = state.current_remote_desc @@ -1204,7 +1211,7 @@ defmodule ExWebRTC.PeerConnection do true true -> - is_negotiation_needed(transceivers, state) + negotiation_needed?(transceivers, state) end end diff --git a/lib/ex_webrtc/peer_connection/configuration.ex b/lib/ex_webrtc/peer_connection/configuration.ex index ccd4e3ee..43496aa8 100644 --- a/lib/ex_webrtc/peer_connection/configuration.ex +++ b/lib/ex_webrtc/peer_connection/configuration.ex @@ -157,10 +157,10 @@ defmodule ExWebRTC.PeerConnection.Configuration do end @doc false - @spec is_supported_codec(t(), RTPCodecParameters.t()) :: boolean() - def is_supported_codec(config, codec) do + @spec supported_codec?(t(), RTPCodecParameters.t()) :: boolean() + def supported_codec?(config, codec) do # This function doesn't check if rtcp-fb is supported. - # Instead, `is_supported_rtcp_fb` has to be used to filter out + # Instead, `supported_rtcp_fb?` has to be used to filter out # rtcp-fb that are not supported. Enum.any?(config.audio_codecs ++ config.video_codecs, fn supported_codec -> %{supported_codec | rtcp_fbs: codec.rtcp_fbs} == codec @@ -168,9 +168,9 @@ defmodule ExWebRTC.PeerConnection.Configuration do end @doc false - @spec is_supported_rtp_hdr_extension(t(), Extmap.t(), :audio | :video) :: + @spec supported_rtp_hdr_extension?(t(), Extmap.t(), :audio | :video) :: boolean() - def is_supported_rtp_hdr_extension(config, rtp_hdr_extension, media_type) do + def supported_rtp_hdr_extension?(config, rtp_hdr_extension, media_type) do supported_uris = case media_type do :audio -> Map.keys(config.audio_rtp_hdr_exts) @@ -181,8 +181,8 @@ defmodule ExWebRTC.PeerConnection.Configuration do end @doc false - @spec is_supported_rtcp_fb(t(), RTCPFeedback.t()) :: boolean() - def is_supported_rtcp_fb(_config, _rtcp_fb), do: false + @spec supported_rtcp_fb?(t(), RTCPFeedback.t()) :: boolean() + def supported_rtcp_fb?(_config, _rtcp_fb), do: false @doc false @spec update(t(), ExSDP.t()) :: t() diff --git a/lib/ex_webrtc/rtp_transceiver.ex b/lib/ex_webrtc/rtp_transceiver.ex index de530cb7..0e0ebef7 100644 --- a/lib/ex_webrtc/rtp_transceiver.ex +++ b/lib/ex_webrtc/rtp_transceiver.ex @@ -122,27 +122,30 @@ defmodule ExWebRTC.RTPTransceiver do @doc false @spec to_answer_mline(t(), ExSDP.Media.t(), Keyword.t()) :: ExSDP.Media.t() def to_answer_mline(transceiver, mline, opts) do - offered_direction = SDPUtils.get_media_direction(mline) - direction = get_direction(offered_direction, transceiver.direction) - opts = Keyword.put(opts, :direction, direction) - # Reject mline. See RFC 8829 sec. 5.3.1 and RFC 3264 sec. 6. # We could reject earlier (as RFC suggests) but we generate # answer mline at first to have consistent fingerprint, ice_ufrag and # ice_pwd values across mlines. + # We also set direction to inactive, even though JSEP doesn't require it. + # See see https://github.com/w3c/webrtc-pc/issues/2927 cond do transceiver.codecs == [] -> # there has to be at least one format so take it from the offer codecs = SDPUtils.get_rtp_codec_parameters(mline) transceiver = %__MODULE__{transceiver | codecs: codecs} + opts = Keyword.put(opts, :direction, :inactive) mline = to_mline(transceiver, opts) %ExSDP.Media{mline | port: 0} transceiver.stopping == true or transceiver.stopped == true -> + opts = Keyword.put(opts, :direction, :inactive) mline = to_mline(transceiver, opts) %ExSDP.Media{mline | port: 0} true -> + offered_direction = SDPUtils.get_media_direction(mline) + direction = get_direction(offered_direction, transceiver.direction) + opts = Keyword.put(opts, :direction, direction) to_mline(transceiver, opts) end end @@ -236,11 +239,11 @@ defmodule ExWebRTC.RTPTransceiver do defp get_codecs(mline, config) do mline |> SDPUtils.get_rtp_codec_parameters() - |> Stream.filter(&Configuration.is_supported_codec(config, &1)) + |> Stream.filter(&Configuration.supported_codec?(config, &1)) |> Enum.map(fn codec -> rtcp_fbs = Enum.filter(codec.rtcp_fbs, fn rtcp_fb -> - Configuration.is_supported_rtcp_fb(config, rtcp_fb) + Configuration.supported_rtcp_fb?(config, rtcp_fb) end) %RTPCodecParameters{codec | rtcp_fbs: rtcp_fbs} @@ -250,6 +253,6 @@ defmodule ExWebRTC.RTPTransceiver do defp get_rtp_hdr_extensions(mline, config) do mline |> ExSDP.get_attributes(ExSDP.Attribute.Extmap) - |> Enum.filter(&Configuration.is_supported_rtp_hdr_extension(config, &1, mline.type)) + |> Enum.filter(&Configuration.supported_rtp_hdr_extension?(config, &1, mline.type)) end end diff --git a/lib/ex_webrtc/sdp_utils.ex b/lib/ex_webrtc/sdp_utils.ex index 2d7d705e..95cac871 100644 --- a/lib/ex_webrtc/sdp_utils.ex +++ b/lib/ex_webrtc/sdp_utils.ex @@ -268,9 +268,9 @@ defmodule ExWebRTC.SDPUtils do |> Enum.find_index(fn {mline, idx} -> mline.port == 0 and idx not in indices end) end - @spec is_rejected(ExSDP.Media.t()) :: boolean() - def is_rejected(%ExSDP.Media{port: 0}), do: true - def is_rejected(%ExSDP.Media{}), do: false + @spec rejected?(ExSDP.Media.t()) :: boolean() + def rejected?(%ExSDP.Media{port: 0}), do: true + def rejected?(%ExSDP.Media{}), do: false defp do_get_ice_credentials(sdp_or_mline) do ice_ufrag = diff --git a/mix.exs b/mix.exs index 8537f607..e7360c81 100644 --- a/mix.exs +++ b/mix.exs @@ -50,7 +50,7 @@ defmodule ExWebRTC.MixProject do defp deps do [ {:ex_sdp, "~> 0.14.0"}, - {:ex_ice, "~> 0.4.0"}, + {:ex_ice, "~> 0.5.0"}, {:ex_dtls, "~> 0.15.0"}, {:ex_libsrtp, "~> 0.7.1"}, {:ex_rtp, "~> 0.3.0"}, diff --git a/mix.lock b/mix.lock index 1ba1976a..d435b814 100644 --- a/mix.lock +++ b/mix.lock @@ -1,33 +1,33 @@ %{ "bunch": {:hex, :bunch, "1.6.1", "5393d827a64d5f846092703441ea50e65bc09f37fd8e320878f13e63d410aec7", [:mix], [], "hexpm", "286cc3add551628b30605efbe2fca4e38cc1bea89bcd0a1a7226920b3364fe4a"}, "bunch_native": {:hex, :bunch_native, "0.5.0", "8ac1536789a597599c10b652e0b526d8833348c19e4739a0759a2bedfd924e63", [:mix], [{:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "24190c760e32b23b36edeb2dc4852515c7c5b3b8675b1a864e0715bdd1c8f80d"}, - "bundlex": {:hex, :bundlex, "1.4.1", "60702b7f8e036a00c88bec69993329cc4aae32fe402804fe2e8db0c1e1396cd6", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, "~> 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "7511718b4b8063e457f3fa5166df177beff65c532db44631f41b496cfa2f48a3"}, - "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, + "bundlex": {:hex, :bundlex, "1.4.5", "ea06cb441af636baaf5232dced24c6b1ee5ccbe7a7cad8a348eb3100fa1d7b52", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, "~> 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "bd4136100d3120740bf8eaa73ad74859d5ccd659cf0b27aa1645590a67a0172b"}, + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, "crc": {:hex, :crc, "0.10.5", "ee12a7c056ac498ef2ea985ecdc9fa53c1bfb4e53a484d9f17ff94803707dfd8", [:mix, :rebar3], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3e673b6495a9525c5c641585af1accba59a1eb33de697bedf341e247012c2c7f"}, - "credo": {:hex, :credo, "1.7.1", "6e26bbcc9e22eefbff7e43188e69924e78818e2fe6282487d0703652bc20fd62", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e9871c6095a4c0381c89b6aa98bc6260a8ba6addccf7f6a53da8849c748a58a2"}, - "dialyxir": {:hex, :dialyxir, "1.4.2", "764a6e8e7a354f0ba95d58418178d486065ead1f69ad89782817c296d0d746a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "516603d8067b2fd585319e4b13d3674ad4f314a5902ba8130cd97dc902ce6bbd"}, + "credo": {:hex, :credo, "1.7.3", "05bb11eaf2f2b8db370ecaa6a6bda2ec49b2acd5e0418bc106b73b07128c0436", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "35ea675a094c934c22fb1dca3696f3c31f2728ae6ef5a53b5d648c11180a4535"}, + "dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"}, "earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"}, - "elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"}, + "elixir_make": {:hex, :elixir_make, "0.7.8", "505026f266552ee5aabca0b9f9c229cbb496c689537c9f922f3eb5431157efc7", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "7a71945b913d37ea89b06966e1342c85cfe549b15e6d6d081e8081c493062c07"}, "elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, "ex_dtls": {:hex, :ex_dtls, "0.15.0", "71a11b0379f4ebeb781548ead0e72194e650cfb6d6c435015c8b36e9e5574f62", [:mix], [{:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "3ff1d9ef6c4b0cc800105979c1c58dc67cada91c593beeae56e05094fdbce865"}, - "ex_ice": {:hex, :ex_ice, "0.4.0", "fdce80373e8bc519be99825b970f7388694bcbe47ad1be99a57bd3b00223a22b", [:mix], [{:ex_stun, "~> 0.1.0", [hex: :ex_stun, repo: "hexpm", optional: false]}], "hexpm", "447a3ba75ebf482b0c07768d942a312e40f047f29d34160b220dd56a59647aa2"}, + "ex_ice": {:hex, :ex_ice, "0.5.0", "8e380afb611b4d48a74d4a8016a0284ed11c77400230e2840e2476856cf6d572", [:mix], [{:ex_stun, "~> 0.1.0", [hex: :ex_stun, repo: "hexpm", optional: false]}], "hexpm", "d5a9d5d4b54650385a9b5365b38d919d5158ab2fec5c13669ae45db494516bb6"}, "ex_libsrtp": {:hex, :ex_libsrtp, "0.7.2", "211bd89c08026943ce71f3e2c0231795b99cee748808ed3ae7b97cd8d2450b6b", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.3", [hex: :bundlex, repo: "hexpm", optional: false]}, {:membrane_precompiled_dependency_provider, "~> 0.1.0", [hex: :membrane_precompiled_dependency_provider, repo: "hexpm", optional: false]}, {:unifex, "~> 1.1", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "2e20645d0d739a4ecdcf8d4810a0c198120c8a2f617f2b75b2e2e704d59f492a"}, "ex_rtcp": {:hex, :ex_rtcp, "0.1.0", "2e02d23fc6ccc7e00aed13358ffdbcb23e34d3a7f35c66cadaa54447383ecae4", [:mix], [], "hexpm", "1c9a7e636f3950fbcefedce31f3e4ca60b84ea80ad519789f9d215167c60cb2b"}, "ex_rtp": {:hex, :ex_rtp, "0.3.0", "d18d0de39875958902816284f79c8cd51ec83d39bdd14edf6a5b069926268a43", [:mix], [], "hexpm", "cec8398237095b02438842cfc74487c3cbaeb7fe29e4c62ae11457a0ddd99754"}, - "ex_sdp": {:hex, :ex_sdp, "0.14.0", "4f6a3fed22ec312c6ad89def77ad0a32f81094cb688c845c5fbb0887f35f5f63", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "bc3de2b015b8eee859ac6e48b8045bf08bfbd8dcdb075db76c19fc1365a9cf90"}, + "ex_sdp": {:hex, :ex_sdp, "0.14.1", "3c49b0a39c919713a3691a5c0637954680e3ad9aec6f87dc9e5a01978a32124a", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "a4d6637b8eda59f218368a677caecffc054f6fc3228bedf17aeb6bfa8a58a6ed"}, "ex_stun": {:hex, :ex_stun, "0.1.0", "252474bf4c8519fbf4bc0fbfc6a1b846a634b1478c65dbbfb4b6ab4e33c2a95a", [:mix], [], "hexpm", "629fc8be45b624a92522f81d85ba001877b1f0745889a2419bdb678790d7480c"}, "excoveralls": {:hex, :excoveralls, "0.17.1", "83fa7906ef23aa7fc8ad7ee469c357a63b1b3d55dd701ff5b9ce1f72442b2874", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "95bc6fda953e84c60f14da4a198880336205464e75383ec0f570180567985ae0"}, - "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, - "finch": {:hex, :finch, "0.16.0", "40733f02c89f94a112518071c0a91fe86069560f5dbdb39f9150042f44dcfb1a", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f660174c4d519e5fec629016054d60edd822cdfe2b7270836739ac2f97735ec5"}, + "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, + "finch": {:hex, :finch, "0.17.0", "17d06e1d44d891d20dbd437335eebe844e2426a0cd7e3a3e220b461127c73f70", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8d014a661bb6a437263d4b5abf0bcbd3cf0deb26b1e8596f2a271d22e48934c7"}, "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.3", "d684f4bac8690e70b06eb52dad65d26de2eefa44cd19d64a8095e1417df7c8fd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "b78dc853d2e670ff6390b605d807263bf606da3c82be37f9d7f68635bd886fc9"}, - "membrane_precompiled_dependency_provider": {:hex, :membrane_precompiled_dependency_provider, "0.1.0", "2ba721d1b5be9b00fb5a9ea7c9a304cbf3f012cbc1e209979aa0641531103112", [:mix], [{:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "73feab552a902af8f64797ddcfd6a1089268eafd07cd5121ead481a26b41354c"}, + "membrane_precompiled_dependency_provider": {:hex, :membrane_precompiled_dependency_provider, "0.1.1", "a0d5b7942f8be452c30744207f78284f6a0e0c84c968aba7d76e206fbf75bc5d", [:mix], [{:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "87ad44752e2cf0fa3b31c5aac15b863343c2f6e0f0fd201f5ec4c0bcda8c6fa3"}, "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, "mint": {:hex, :mint, "1.5.2", "4805e059f96028948870d23d7783613b7e6b0e2fb4e98d720383852a760067fd", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "d77d9e9ce4eb35941907f1d3df38d8f750c357865353e21d335bdcdf6d892a02"}, "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, @@ -38,5 +38,5 @@ "shmex": {:hex, :shmex, "0.5.0", "7dc4fb1a8bd851085a652605d690bdd070628717864b442f53d3447326bcd3e8", [:mix], [{:bunch_native, "~> 0.5.0", [hex: :bunch_native, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "b67bb1e22734758397c84458dbb746519e28eac210423c267c7248e59fc97bdc"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "unifex": {:hex, :unifex, "1.1.0", "26b1bcb6c3b3454e1ea15f85b2e570aaa5b5c609566aa9f5c2e0a8b213379d6b", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}, {:shmex, "~> 0.5.0", [hex: :shmex, repo: "hexpm", optional: false]}], "hexpm", "d8f47e9e3240301f5b20eec5792d1d4341e1a3a268d94f7204703b48da4aaa06"}, - "zarex": {:hex, :zarex, "1.0.3", "a9e9527a1c31df7f39499819bd76ccb15b0b4e479eed5a4a40db9df7ad7db25c", [:mix], [], "hexpm", "4400a7d33bbf222383ce9a3d5ec9411798eb2b12e86c65ad8e6ac08d8116ca8b"}, + "zarex": {:hex, :zarex, "1.0.5", "58239e3ee5d75f343262bb4df5cf466555a1c689f920e5d3651a9333972f7c7e", [:mix], [], "hexpm", "9fb72ef0567c2b2742f5119a1ba8a24a2fabb21b8d09820aefbf3e592fa9a46a"}, } diff --git a/test/ex_webrtc/peer_connection_test.exs b/test/ex_webrtc/peer_connection_test.exs index 3ae799c2..63776a04 100644 --- a/test/ex_webrtc/peer_connection_test.exs +++ b/test/ex_webrtc/peer_connection_test.exs @@ -8,6 +8,7 @@ defmodule ExWebRTC.PeerConnectionTest do RTPSender, MediaStreamTrack, PeerConnection, + RTPCodecParameters, SessionDescription, Utils } @@ -900,4 +901,47 @@ defmodule ExWebRTC.PeerConnectionTest do assert [%RTPTransceiver{direction: :inactive, current_direction: :inactive}] = PeerConnection.get_transceivers(pc2) end + + test "no supported codecs" do + {:ok, pc1} = + PeerConnection.start_link( + video_codecs: [ + %RTPCodecParameters{ + payload_type: 96, + mime_type: "video/VP8", + clock_rate: 90_000 + } + ] + ) + + {:ok, pc2} = + PeerConnection.start_link( + video_codecs: [ + %RTPCodecParameters{ + payload_type: 45, + mime_type: "video/AV1", + clock_rate: 90_000 + } + ] + ) + + {:ok, _tr} = PeerConnection.add_transceiver(pc1, :video) + + assert_receive {:ex_webrtc, ^pc1, :negotiation_needed} + + :ok = negotiate(pc1, pc2) + + assert [] == PeerConnection.get_transceivers(pc1) + assert [] == PeerConnection.get_transceivers(pc2) + + assert_receive {:ex_webrtc, ^pc1, {:track_ended, _track_id}} + assert_receive {:ex_webrtc, ^pc2, {:track, pc2_track}} + pc2_track_id = pc2_track.id + assert_receive {:ex_webrtc, ^pc2, {:track_muted, ^pc2_track_id}} + assert_receive {:ex_webrtc, ^pc2, {:track_ended, ^pc2_track_id}} + + # make sure there was only one negotiation_needed fired + refute_receive {:ex_webrtc, ^pc1, :negotiation_needed} + refute_receive {:ex_webrtc, ^pc2, :negotiation_needed}, 0 + end end diff --git a/test/ex_webrtc/sdp_utils_test.exs b/test/ex_webrtc/sdp_utils_test.exs index 7f2176b1..98e4d145 100644 --- a/test/ex_webrtc/sdp_utils_test.exs +++ b/test/ex_webrtc/sdp_utils_test.exs @@ -3,11 +3,11 @@ defmodule ExWebRTC.SDPUtilsTest do alias ExWebRTC.SDPUtils - test "is_rejected/1" do + test "rejected?/1" do mline = ExSDP.Media.new(:audio, 0, "UDP/TLS/RTP/SAVPF", [8]) - assert true == SDPUtils.is_rejected(mline) + assert true == SDPUtils.rejected?(mline) mline = ExSDP.Media.new(:audio, 9, "UDP/TLS/RTP/SAVPF", [8]) - assert false == SDPUtils.is_rejected(mline) + assert false == SDPUtils.rejected?(mline) end end