From af6bb25d4ee36363b344edd9361fbf91d7ce8d12 Mon Sep 17 00:00:00 2001 From: noarkhh Date: Wed, 17 Apr 2024 18:02:25 +0200 Subject: [PATCH 1/6] Bump deps --- camera_to_hls_nerves/mix.exs | 4 +- camera_to_hls_nerves/mix.lock | 37 +++++++++--------- rtsp_to_hls/mix.exs | 10 ++--- rtsp_to_hls/mix.lock | 71 +++++++++++++---------------------- 4 files changed, 52 insertions(+), 70 deletions(-) diff --git a/camera_to_hls_nerves/mix.exs b/camera_to_hls_nerves/mix.exs index 394c56c8..31bb0692 100644 --- a/camera_to_hls_nerves/mix.exs +++ b/camera_to_hls_nerves/mix.exs @@ -37,8 +37,8 @@ defmodule CameraToHlsNerves.MixProject do {:ring_logger, "~> 0.10.0"}, {:toolshed, "~> 0.3.0"}, {:membrane_rpicam_plugin, "~> 0.1.0"}, - {:membrane_h264_plugin, "~> 0.9.0"}, - {:membrane_http_adaptive_stream_plugin, "~> 0.18.0"}, + {:membrane_h26x_plugin, "~> 0.10.1"}, + {:membrane_http_adaptive_stream_plugin, "~> 0.18.4"}, # Allow Nerves.Runtime on host to support development, testing and CI. # See config/host.exs for usage. diff --git a/camera_to_hls_nerves/mix.lock b/camera_to_hls_nerves/mix.lock index f5209b80..61620cc9 100644 --- a/camera_to_hls_nerves/mix.lock +++ b/camera_to_hls_nerves/mix.lock @@ -2,39 +2,40 @@ "beam_notify": {:hex, :beam_notify, "1.1.0", "4ce38e27460a3c03b6f77c10c6f31458b035ebb1035cd52d4b3e771311837dba", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "8547a310702bfcea0e401534398617b940808ff6ad10c43dddc85c169de7b9cc"}, "bimap": {:hex, :bimap, "1.3.0", "3ea4832e58dc83a9b5b407c6731e7bae87458aa618e6d11d8e12114a17afa4b3", [:mix], [], "hexpm", "bf5a2b078528465aa705f405a5c638becd63e41d280ada41e0f77e6d255a10b4"}, "bunch": {:hex, :bunch, "1.6.1", "5393d827a64d5f846092703441ea50e65bc09f37fd8e320878f13e63d410aec7", [:mix], [], "hexpm", "286cc3add551628b30605efbe2fca4e38cc1bea89bcd0a1a7226920b3364fe4a"}, - "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, + "castore": {:hex, :castore, "1.0.6", "ffc42f110ebfdafab0ea159cd43d31365fa0af0ce4a02ecebf1707ae619ee727", [:mix], [], "hexpm", "374c6e7ca752296be3d6780a6d5b922854ffcc74123da90f2f328996b962d33a"}, "circular_buffer": {:hex, :circular_buffer, "0.4.1", "477f370fd8cfe1787b0a1bade6208bbd274b34f1610e41f1180ba756a7679839", [:mix], [], "hexpm", "633ef2e059dde0d7b89bbab13b1da9d04c6685e80e68fbdf41282d4fae746b72"}, "coerce": {:hex, :coerce, "1.0.1", "211c27386315dc2894ac11bc1f413a0e38505d808153367bd5c6e75a4003d096", [:mix], [], "hexpm", "b44a691700f7a1a15b4b7e2ff1fa30bebd669929ac8aa43cffe9e2f8bf051cf1"}, - "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.8.3", "d38d7ee1578d722d89b4d452a3e36bcfdc644c618f0d063b874661876e708683", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.0", [hex: :certifi, repo: "hexpm", optional: true]}], "hexpm", "5c99a18571a756d4af7a4d89ca75c28ac899e6103af6f223982f09ce44942cc9"}, "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, - "mdns_lite": {:hex, :mdns_lite, "0.8.8", "e455f4d99dc708a9996ae8559f2893429ef39f0ca7d84ee63ce0e4b2f6a00a3f", [:mix], [{:vintage_net, "~> 0.7", [hex: :vintage_net, repo: "hexpm", optional: true]}], "hexpm", "221badb8e7b2a725ef642dc6121a61d8bfb7bad2a70afcc97bce6c9c7ce3c47c"}, + "logger_backends": {:hex, :logger_backends, "1.0.0", "09c4fad6202e08cb0fbd37f328282f16539aca380f512523ce9472b28edc6bdf", [:mix], [], "hexpm", "1faceb3e7ec3ef66a8f5746c5afd020e63996df6fd4eb8cdb789e5665ae6c9ce"}, + "mdns_lite": {:hex, :mdns_lite, "0.8.10", "d89183b737f95c243da94297c8d25460493b3ab2452100b2037987a07642070d", [:mix], [{:vintage_net, "~> 0.7", [hex: :vintage_net, repo: "hexpm", optional: true]}], "hexpm", "2723259aa4587b269a625ff61d1cff0cd30a8940288b7b998aec0e4139ec98eb"}, "membrane_aac_format": {:hex, :membrane_aac_format, "0.8.0", "515631eabd6e584e0e9af2cea80471fee6246484dbbefc4726c1d93ece8e0838", [:mix], [{:bimap, "~> 1.1", [hex: :bimap, repo: "hexpm", optional: false]}], "hexpm", "a30176a94491033ed32be45e51d509fc70a5ee6e751f12fd6c0d60bd637013f6"}, "membrane_aac_plugin": {:hex, :membrane_aac_plugin, "0.18.1", "30433bffd4d5d773f79448dd9afd55d77338721688f09a89b20d742a68cc2c3d", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "8fd048c47d5d2949eb557e19f43f62d534d3af5096187f1a1a3a1694d14b772c"}, - "membrane_cmaf_format": {:hex, :membrane_cmaf_format, "0.7.0", "573bfff6acf2371c5046b9174569f6316f4205e3d6e13e814bf7e613e5653a54", [:mix], [], "hexpm", "4ac6a24a33f61347a2714c982a5f84aa6207641f4de2ad5afde68a8b800da8de"}, - "membrane_core": {:hex, :membrane_core, "1.0.0", "1b543aefd952283be1f2a215a1db213aa4d91222722ba03cd35280622f1905ee", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "352c90fd0a29942143c4bf7a727cc05c632e323f50a1a4e99321b1e8982f1533"}, - "membrane_file_plugin": {:hex, :membrane_file_plugin, "0.16.0", "7917f6682c22b9bcfc2ca20ed960eee0f7d03ad31fd5f59ed850f1fe3ddd545a", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "b0727998f75a9b4dab8a2baefdfc13c3eac00a04e061ab1b0e61dc5566927acc"}, + "membrane_cmaf_format": {:hex, :membrane_cmaf_format, "0.7.1", "9ea858faefdcb181cdfa8001be827c35c5f854e9809ad57d7062cff1f0f703fd", [:mix], [], "hexpm", "3c7b4ed2a986e27f6f336d2f19e9442cb31d93b3142fc024c019572faca54a73"}, + "membrane_core": {:hex, :membrane_core, "1.0.1", "08aa546c0d131c66f8b906b3dfb2b8f2749b56859f6fc52bd3ac846b944b3baa", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a35ed68561bdf0a2dbb2f994333be78cf4e1c4d734e4cd927d77d92049bb1273"}, + "membrane_file_plugin": {:hex, :membrane_file_plugin, "0.17.0", "e855a848e84eaed537b41fd4436712038fc5518059eadc8609c83cd2d819653a", [:mix], [{:logger_backends, "~> 1.0", [hex: :logger_backends, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "9c3653ca9f13bb409b36257d6094798d4625c739ab7a4035c12308622eb16e0b"}, "membrane_h264_format": {:hex, :membrane_h264_format, "0.6.1", "44836cd9de0abe989b146df1e114507787efc0cf0da2368f17a10c47b4e0738c", [:mix], [], "hexpm", "4b79be56465a876d2eac2c3af99e115374bbdc03eb1dea4f696ee9a8033cd4b0"}, - "membrane_h264_plugin": {:hex, :membrane_h264_plugin, "0.9.1", "ea140ab1ca21c528563675fdd7e14c80607e120e320dc930cac3dcfb4db3fc2b", [:mix], [{:bunch, "~> 1.4", [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]}], "hexpm", "8f10db817e691fc1234ed85fe674b3f8718d3a410e4582736dcdd53664cae725"}, "membrane_h265_format": {:hex, :membrane_h265_format, "0.2.0", "1903c072cf7b0980c4d0c117ab61a2cd33e88782b696290de29570a7fab34819", [:mix], [], "hexpm", "6df418bdf242c0d9f7dbf2e5aea4c2d182e34ac9ad5a8b8cef2610c290002e83"}, - "membrane_http_adaptive_stream_plugin": {:hex, :membrane_http_adaptive_stream_plugin, "0.18.1", "3357af412e34f26d2d7a2c82fdafa926bcc363fde6189da059ec2aae493ffc38", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_plugin, "~> 0.18.0", [hex: :membrane_aac_plugin, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h264_plugin, "~> 0.9.0", [hex: :membrane_h264_plugin, repo: "hexpm", optional: false]}, {:membrane_mp4_plugin, "~> 0.31.0", [hex: :membrane_mp4_plugin, repo: "hexpm", optional: false]}, {:membrane_tee_plugin, "~> 0.12.0", [hex: :membrane_tee_plugin, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}], "hexpm", "3bdf35c9c6757045021edf7547234e809d18d3f837c690981a27ab768535a2d7"}, + "membrane_h26x_plugin": {:hex, :membrane_h26x_plugin, "0.10.1", "d7aeb166da55c6573b2178e18caeea290b09fd6f3cca428454085223e81476a0", [:mix], [{:bunch, "~> 1.4", [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_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}], "hexpm", "9cd63a67ffed0654a932efff34395ded04a05e48d08ea996c93daebf889dac08"}, + "membrane_http_adaptive_stream_plugin": {:hex, :membrane_http_adaptive_stream_plugin, "0.18.4", "f938907eb0e39db2acf8c84e0b770c1976b2793bd58c2e37eca0334dc019f11d", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_plugin, "~> 0.18.0", [hex: :membrane_aac_plugin, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h26x_plugin, "~> 0.10.0", [hex: :membrane_h26x_plugin, repo: "hexpm", optional: false]}, {:membrane_mp4_plugin, "~> 0.34.1", [hex: :membrane_mp4_plugin, repo: "hexpm", optional: false]}, {:membrane_tee_plugin, "~> 0.12.0", [hex: :membrane_tee_plugin, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}], "hexpm", "3f9174faf1f734f1b8507aeea0525384869797e51b88f1b2e33931bae9de32fc"}, "membrane_mp4_format": {:hex, :membrane_mp4_format, "0.8.0", "8c6e7d68829228117d333b4fbb030e7be829aab49dd8cb047fdc664db1812e6a", [:mix], [], "hexpm", "148dea678a1f82ccfd44dbde6f936d2f21255f496cb45a22cc6eec427f025522"}, - "membrane_mp4_plugin": {:hex, :membrane_mp4_plugin, "0.31.0", "1932c86e2f4a24aca1b99ee531a131fd0da1128db8975ba8f8738e3b1bbcfabd", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_cmaf_format, "~> 0.7.0", [hex: :membrane_cmaf_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_file_plugin, "~> 0.16.0", [hex: :membrane_file_plugin, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_h264_plugin, "~> 0.9.0", [hex: :membrane_h264_plugin, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_mp4_format, "~> 0.8.0", [hex: :membrane_mp4_format, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}], "hexpm", "9968e56e02085228974bf6a59c8858f3c0d9800a4e767c1b3b2f2890050c72f4"}, + "membrane_mp4_plugin": {:hex, :membrane_mp4_plugin, "0.34.1", "f34088908b6fae1cb0f9149ddf27fecb8562f97fa81157cf11e7afe3eb86cf7c", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_cmaf_format, "~> 0.7.0", [hex: :membrane_cmaf_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_file_plugin, "~> 0.17.0", [hex: :membrane_file_plugin, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_mp4_format, "~> 0.8.0", [hex: :membrane_mp4_format, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}], "hexpm", "05d53624c63b1b6acb6865e2fd89f7dec713f3b54d82ba541228e1d8f1493b62"}, "membrane_opus_format": {:hex, :membrane_opus_format, "0.3.0", "3804d9916058b7cfa2baa0131a644d8186198d64f52d592ae09e0942513cb4c2", [:mix], [], "hexpm", "8fc89c97be50de23ded15f2050fe603dcce732566fe6fdd15a2de01cb6b81afe"}, "membrane_rpicam_plugin": {:hex, :membrane_rpicam_plugin, "0.1.4", "d3fd810a8137e7114838c3c2c6b26101ba066771e1cf01560053596f4ce4324f", [:mix], [{:bunch, "~> 1.4", [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]}], "hexpm", "e5d7a403344dd3543211ca04059d15e2edf55fe70b750187194e81ddeef60f33"}, "membrane_tee_plugin": {:hex, :membrane_tee_plugin, "0.12.0", "f94989b4080ef4b7937d74c1a14d3379577c7bd4c6d06e5a2bb41c351ad604d4", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "0d61c9ed5e68e5a75d54200e1c6df5739c0bcb52fee0974183ad72446a179887"}, - "muontrap": {:hex, :muontrap, "1.3.3", "3bdf0306d495634beef4a7b36e9733f4514f9b6329af5bf6555db2bd5188b687", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "277e3c3573db886d46bf1f454ed397e6086bf6d5f76d747a1b079fc759a104c5"}, - "nerves": {:hex, :nerves, "1.10.4", "9c7e1f3e0e2896216c1b623dc05e05ec434d5f3f1d8291d4688b61b1a4f5540d", [:make, :mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "2e9c728f1d95e6ce998a4836d2f96f27777663953339d0f85fb68dc11ab48f1d"}, + "muontrap": {:hex, :muontrap, "1.5.0", "bf5c273872379968615a39974458328209ac97fa1f588396192131ff973d1ca2", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "daf605e877f60b5be9215e3420d7971fc468677b29921e40915b15fd928273d4"}, + "nerves": {:hex, :nerves, "1.10.5", "9c4296a5fd9c48858a92b17ae52cfcf1bc9acfefdc2da5c10ec79e4c139ecaec", [:make, :mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "a1309b6c56e2797f7514e89afc61b7c06803f359e94b00ac006bef4e611d95e9"}, "nerves_logging": {:hex, :nerves_logging, "0.2.2", "d0e878ac92e6907757fa9898b661250fa1cf50474763ca59ecfadca1c2235337", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "74c181c6f011ea0c2d52956ad82065a59d7c7b62ddfba5967b010ef125f460a5"}, "nerves_motd": {:hex, :nerves_motd, "0.1.13", "5ab28a458e8ba8cf7f165573dd413f3ed0f9720dc08eda51c2bcb0d7edffa9ee", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:nerves_time, "~> 0.4", [hex: :nerves_time, repo: "hexpm", optional: true]}, {:nerves_time_zones, "~> 0.1", [hex: :nerves_time_zones, repo: "hexpm", optional: true]}], "hexpm", "f3fee43ab52181b0de015eec4a9835b99526170ac83a0f621a155f458e1c9eeb"}, "nerves_pack": {:hex, :nerves_pack, "0.7.0", "bc93834edbb9321b180dc104440070279eb02159359715f68f770e74ed86a582", [:mix], [{:mdns_lite, "~> 0.8", [hex: :mdns_lite, repo: "hexpm", optional: false]}, {:nerves_motd, "~> 0.1", [hex: :nerves_motd, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.6", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:nerves_ssh, "~> 0.3", [hex: :nerves_ssh, repo: "hexpm", optional: false]}, {:nerves_time, "~> 0.3", [hex: :nerves_time, repo: "hexpm", optional: false]}, {:ring_logger, "~> 0.8", [hex: :ring_logger, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.10", [hex: :vintage_net, repo: "hexpm", optional: false]}, {:vintage_net_direct, "~> 0.10", [hex: :vintage_net_direct, repo: "hexpm", optional: false]}, {:vintage_net_ethernet, "~> 0.10", [hex: :vintage_net_ethernet, repo: "hexpm", optional: false]}, {:vintage_net_wifi, "~> 0.10", [hex: :vintage_net_wifi, repo: "hexpm", optional: false]}], "hexpm", "65a43ea78c10938c87c72d6d42a82c05e831e9a95a0ea26fe8f9d848c009cc57"}, - "nerves_runtime": {:hex, :nerves_runtime, "0.13.6", "aef9cb5e6232605d4e5421b297f41cde0535a53913c21e51c7ebe6c71c1b9cf6", [:mix], [{:nerves_logging, "~> 0.2.0", [hex: :nerves_logging, repo: "hexpm", optional: false]}, {:nerves_uevent, "~> 0.1.0", [hex: :nerves_uevent, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.3.0 or ~> 1.0", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm", "44b031f46542079d67d3ef0bd7b0c966e580909dd5cc61b7825a76e881e7cd5a"}, + "nerves_runtime": {:hex, :nerves_runtime, "0.13.7", "0a7b15d5f55af1b695f7a4a1bd597c2f6101f8cbe7fe7a30743e3e441b7e233f", [:mix], [{:nerves_logging, "~> 0.2.0", [hex: :nerves_logging, repo: "hexpm", optional: false]}, {:nerves_uevent, "~> 0.1.0", [hex: :nerves_uevent, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.3.0 or ~> 1.0", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm", "6bafb89344709e5405cc7f9b140f91ca76ea3749f0eb3af80d8f8b8c53388b2d"}, "nerves_ssh": {:hex, :nerves_ssh, "0.4.3", "32540ad52a9781b7b1a1427ea1d282a9129f16b40f0a06de2074019ed455e760", [:mix], [{:nerves_runtime, "~> 0.11", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:ssh_subsystem_fwup, "~> 0.5", [hex: :ssh_subsystem_fwup, repo: "hexpm", optional: false]}], "hexpm", "dfd079e4609d1d231dd29a9588534957a24c0baed1f434233dbfc2a679ea14d8"}, - "nerves_system_br": {:hex, :nerves_system_br, "1.24.1", "2c9df0bee3bc01a971e1d72a5b137fe9448a74ba1fdd0da02c52e291b468f8a7", [:mix], [], "hexpm", "d13ce0501f4db51869628d138edf5bffbb4fe38f3afa9f9f1e5371f7501535ff"}, - "nerves_system_rpi4": {:hex, :nerves_system_rpi4, "1.24.1", "a6f61fa0a76dd2507266ca2d8b66db16f4c65899bd4f3f59a53f54f74a00dac2", [:mix], [{:nerves, "~> 1.5.4 or ~> 1.6.0 or ~> 1.7.15 or ~> 1.8", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.24.1", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_aarch64_nerves_linux_gnu, "~> 1.8.0", [hex: :nerves_toolchain_aarch64_nerves_linux_gnu, repo: "hexpm", optional: false]}], "hexpm", "57fdf3e6551716be2cca2ac05eeef33be9603643e36b799b347a20b43997fcc0"}, + "nerves_system_br": {:hex, :nerves_system_br, "1.27.0", "95be1ddfe55554d45cd30c2e534a2090691ec94126f3bdc22cd507890adb0e32", [:mix], [], "hexpm", "95a89c478aa6a35cb8baf2554c1840f2057d93bc14cc8d5acce0124c8487c96c"}, + "nerves_system_rpi4": {:hex, :nerves_system_rpi4, "1.27.0", "f393cdbb8cbd40dfdae0bc220f5ea3cb239776bae7f8a9ed9ea7c56b62827c5a", [:mix], [{:nerves, "~> 1.5.4 or ~> 1.6.0 or ~> 1.7.15 or ~> 1.8", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "1.27.0", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_aarch64_nerves_linux_gnu, "~> 13.2.0", [hex: :nerves_toolchain_aarch64_nerves_linux_gnu, repo: "hexpm", optional: false]}], "hexpm", "dc2ee32d8829367d291e03f474ab89415c0d836dbbccfbe07e0cb5639f213573"}, "nerves_time": {:hex, :nerves_time, "0.4.6", "f02e5e866149f3884a4b125104a5b677f7e61d271c1f7d87bc989197dc02dae5", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5 or ~> 1.0", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "1fecb9e9dd098c0e93d35205a79e604831779f2d2313cfe7c31d181678e26ce6"}, - "nerves_toolchain_aarch64_nerves_linux_gnu": {:hex, :nerves_toolchain_aarch64_nerves_linux_gnu, "1.8.0", "40f7fe58737aaa9c6beee0e3599cca2265d1b4e40d7ab2713d7ad872349f21c2", [:mix], [{:nerves, "~> 1.4", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.9.3", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm", "c06a16b54634bbab7348ee7686e3b02574e0af742144c406b0f196b5b374349c"}, - "nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.9.3", "60e87fde05988c4264babc8d68a9221c7b8fe5dc195b7d1526f29b8e626c735c", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}], "hexpm", "2b6edb0687b7f78d3fa49958d759f647e351b23c1f59f637c617a6dc179994ae"}, + "nerves_toolchain_aarch64_nerves_linux_gnu": {:hex, :nerves_toolchain_aarch64_nerves_linux_gnu, "13.2.0", "68fcd2c21c86cceb9545948fae052d72f88b7c7c10205b252dac88559e2a3369", [:mix], [{:nerves, "~> 1.4", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.10.0", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm", "f92212606919a062f975e7bd82ed8a1b95bd4864abb3444cd0d5d0e610e94cc5"}, + "nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.10.0", "c6b35377a0b7a93633a8673a788f1580fe1fa06083374b0e4df36da65828d2ef", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}], "hexpm", "e4ae1a2b84de3502ecac195765819be0ce2834eb276553163a7c03133f1760f1"}, "nerves_uevent": {:hex, :nerves_uevent, "0.1.0", "651111a46be9a238560cbf7946989fc500e5f33d7035fd9ea7194d07a281bc19", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:property_table, "~> 0.2.0", [hex: :property_table, repo: "hexpm", optional: false]}], "hexpm", "cb0b1993c3ed3cefadbcdb534e910af0661f95c3445796ce8a7c8be3519a4e5f"}, "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"}, "one_dhcpd": {:hex, :one_dhcpd, "2.0.2", "49ae0bc4ecc4bf958a2e3eb9c25149dbb37102b77163ed3f9ebadfe49090b44a", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f95de030d199c834dacacc8420881e21c27cec60371711bdffd2fc183234cbf8"}, @@ -42,7 +43,7 @@ "qex": {:hex, :qex, "0.5.1", "0d82c0f008551d24fffb99d97f8299afcb8ea9cf99582b770bd004ed5af63fd6", [:mix], [], "hexpm", "935a39fdaf2445834b95951456559e9dc2063d0a055742c558a99987b38d6bab"}, "ratio": {:hex, :ratio, "3.0.2", "60a5976872a4dc3d873ecc57eed1738589e99d1094834b9c935b118231297cfb", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:numbers, "~> 5.2.0", [hex: :numbers, repo: "hexpm", optional: false]}], "hexpm", "3a13ed5a30ad0bfd7e4a86bf86d93d2b5a06f5904417d38d3f3ea6406cdfc7bb"}, "ring_logger": {:hex, :ring_logger, "0.10.5", "3cbf444df171e80da1d7e25ecc226375bdda8f31b7b5892784cc2d26d01e5c66", [:mix], [{:circular_buffer, "~> 0.4.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}], "hexpm", "16ac1fb35eea6e0ebeedde695ed973cf27fe43e76d4877bd593b9f8efc754ffe"}, - "shoehorn": {:hex, :shoehorn, "0.9.1", "8e12670024c2942e3c2fdd27cd5a034ee0337ee7c25c37b3ebc2ad482de67199", [:mix], [], "hexpm", "fccd040ac22de9b3cc111bbf78a363832c7210010a3fff4a550fbb2f10de0692"}, + "shoehorn": {:hex, :shoehorn, "0.9.2", "7e430e6f27ba4f6519699e54e8aab52520e658d1a11a5ddf01a1af1602416280", [:mix], [], "hexpm", "044353552341925a930681f66595e5d8ed4748d6e4200b8c877a3859016d1a11"}, "ssh_subsystem_fwup": {:hex, :ssh_subsystem_fwup, "0.6.1", "628f8e3795de5f1d0e7b3b55de4248ab0a77ab4c47e3cd282f1dda89d6354a9f", [:mix], [], "hexpm", "babdae337f2dc011ab5478662b4ec850650d7acfb165662ae47f6f0ce8892499"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "toolshed": {:hex, :toolshed, "0.3.1", "9c7f90c015e8f6034eb43c4f5203ac6226d0db5f1a575ccf69af94b5d77cba64", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: true]}], "hexpm", "92fc4a792cd1dbc4fd6963431b5c3511e88454c68e32a30cf17366905b43612e"}, @@ -50,5 +51,5 @@ "vintage_net": {:hex, :vintage_net, "0.13.5", "b02cbb44434eba68d8e991e7c9a75d491da73c3073ff4823843e66f451d6f088", [:make, :mix], [{:beam_notify, "~> 0.2.0 or ~> 1.0", [hex: :beam_notify, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0 or ~> 2.1.0 or ~> 3.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.1 or ~> 0.6.0 or ~> 1.0", [hex: :muontrap, repo: "hexpm", optional: false]}, {:property_table, "~> 0.2.0", [hex: :property_table, repo: "hexpm", optional: false]}], "hexpm", "67e04b8eaa40600bbea4902aba363792598b31cf144f6033d93d7662b60519ad"}, "vintage_net_direct": {:hex, :vintage_net_direct, "0.10.7", "940561c375f04d6734ac78100ae1d8ef790ffd7e966f70efb525230fa1bc5774", [:mix], [{:one_dhcpd, "~> 0.2.3 or ~> 1.0 or ~> 2.0", [hex: :one_dhcpd, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.9.1 or ~> 0.10.0 or ~> 0.11.0 or ~> 0.12.0 or ~> 0.13.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "c040e9c33220495c28ba4464c5924da00bd4949627c4cb9c99ba1ed96f7b9429"}, "vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.11.2", "ef67db5ace9ad5ca5bf229a507247f9eb45b847dc0ff694a6e8a156ed9c5915d", [:mix], [{:vintage_net, "~> 0.12.0 or ~> 0.13.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "6915f9e15e1aa15e52d1948f318ce5109181d1ad7aaa50016bad5dd8e22df9ea"}, - "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.12.0", "2634834ff7ff4a8b11d29fcac2d88f3dfeed749e01db025d8ee2acaf04a32dcb", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.12.0 or ~> 0.13.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "20b12db6b976db44d3df53341155162ec5376b2db5603677ab025cc8bd74b0b1"}, + "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.12.5", "a19a3f78070470ecc00fa1d3d32982c41f39c2c06edb6cd53a8c13905aed8623", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.12.0 or ~> 0.13.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "4b477b9cccf54145bd6f7bf1f023ece63fa11395229bae365861de062c60a2f0"}, } diff --git a/rtsp_to_hls/mix.exs b/rtsp_to_hls/mix.exs index 54ceab8f..78bd13fa 100644 --- a/rtsp_to_hls/mix.exs +++ b/rtsp_to_hls/mix.exs @@ -31,12 +31,12 @@ defmodule Membrane.Demo.RtspToHls.MixProject do {:dialyxir, ">= 0.0.0", only: :dev, runtime: false}, {:credo, ">= 0.0.0", only: :dev, runtime: false}, {:connection, "~> 1.1"}, - {:membrane_rtsp, "~> 0.5.0"}, - {:membrane_udp_plugin, "~> 0.12.0"}, - {:membrane_rtp_plugin, "~> 0.24.0"}, + {:membrane_rtsp, "~> 0.6.2"}, + {:membrane_udp_plugin, "~> 0.13.0"}, + {:membrane_rtp_plugin, "~> 0.27.1"}, {:membrane_rtp_h264_plugin, "~> 0.19.0"}, - {:membrane_http_adaptive_stream_plugin, "~> 0.18.0"}, - {:membrane_h264_plugin, "~> 0.9.0"}, + {:membrane_http_adaptive_stream_plugin, "~> 0.18.4"}, + {:membrane_h26x_plugin, "~> 0.10.1"}, {:membrane_realtimer_plugin, "~> 0.9.0"} ] end diff --git a/rtsp_to_hls/mix.lock b/rtsp_to_hls/mix.lock index 84ca544d..6775a931 100644 --- a/rtsp_to_hls/mix.lock +++ b/rtsp_to_hls/mix.lock @@ -1,68 +1,49 @@ %{ "bimap": {:hex, :bimap, "1.3.0", "3ea4832e58dc83a9b5b407c6731e7bae87458aa618e6d11d8e12114a17afa4b3", [:mix], [], "hexpm", "bf5a2b078528465aa705f405a5c638becd63e41d280ada41e0f77e6d255a10b4"}, - "bunch": {:hex, :bunch, "1.6.0", "4775f8cdf5e801c06beed3913b0bd53fceec9d63380cdcccbda6be125a6cfd54", [:mix], [], "hexpm", "ef4e9abf83f0299d599daed3764d19e8eac5d27a5237e5e4d5e2c129cfeb9a22"}, - "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.3.0", "9f376ac6f997f0a30041b9e3b473390b464ffbb7b6c001353f0ce95bf1e32d7c", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, "~> 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:secure_random, "~> 0.5", [hex: :secure_random, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "4e4849ecb658404d91b2305227cf73ca181a72bc4e602b9a0da90ffbd64cdf8b"}, - "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"}, - "castore": {:hex, :castore, "1.0.4", "ff4d0fb2e6411c0479b1d965a814ea6d00e51eb2f58697446e9c41a97d940b28", [:mix], [], "hexpm", "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8"}, + "bunch": {:hex, :bunch, "1.6.1", "5393d827a64d5f846092703441ea50e65bc09f37fd8e320878f13e63d410aec7", [:mix], [], "hexpm", "286cc3add551628b30605efbe2fca4e38cc1bea89bcd0a1a7226920b3364fe4a"}, + "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "coerce": {:hex, :coerce, "1.0.1", "211c27386315dc2894ac11bc1f413a0e38505d808153367bd5c6e75a4003d096", [:mix], [], "hexpm", "b44a691700f7a1a15b4b7e2ff1fa30bebd669929ac8aa43cffe9e2f8bf051cf1"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "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.6.4", "ddd474afb6e8c240313f3a7b0d025cc3213f0d171879429bf8535d7021d9ad78", [:mix], [{:bunt, "~> 0.2.0", [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", "c28f910b61e1ff829bffa056ef7293a8db50e87f2c57a9b5c3f57eee124536b7"}, - "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.26", "f4291134583f373c7d8755566122908eb9662df4c4b63caa66a0eabe06569b0a", [:mix], [], "hexpm", "48d460899f8a0c52c5470676611c01f64f3337bad0b26ddab43648428d94aabc"}, - "elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"}, + "credo": {:hex, :credo, "1.7.5", "643213503b1c766ec0496d828c90c424471ea54da77c8a168c725686377b9545", [: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", "f799e9b5cd1891577d8c773d245668aa74a2fcd15eb277f51a0131690ebfb3fd"}, + "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_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.28.4", "001a0ea6beac2f810f1abc3dbf4b123e9593eaa5f00dd13ded024eae7c523298", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "bf85d003dd34911d89c8ddb8bda1a958af3471a274a4c2150a9c01c78ac3f8ed"}, - "ex_sdp": {:hex, :ex_sdp, "0.11.0", "19e3af1d70b945381752db3139dfc22a19da1e9394036721449b7fb8c49fe039", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm", "7a3fe42f4ec0c18de09b10464829c27482d81d9c50c21bdebdbcfe17d2046408"}, - "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"}, + "ex_doc": {:hex, :ex_doc, "0.32.1", "21e40f939515373bcdc9cffe65f3b3543f05015ac6c3d01d991874129d173420", [: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", "5142c9db521f106d61ff33250f779807ed2a88620e472ac95dc7d59c380113da"}, + "ex_sdp": {:hex, :ex_sdp, "0.15.0", "53815fb5b5e4fae0f3b26de90f372446bb8e0eed62a3cc20394d3c29519698be", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "d3f23596b73e7057521ff0f0d55b1189c6320a2f04388aa3a80a0aa97ffb379f"}, + "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "heap": {:hex, :heap, "2.0.2", "d98cb178286cfeb5edbcf17785e2d20af73ca57b5a2cf4af584118afbcf917eb", [:mix], [], "hexpm", "ba9ea2fe99eb4bcbd9a8a28eaf71cbcac449ca1d8e71731596aace9028c9d429"}, - "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, - "jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"}, - "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, + "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "logger_backends": {:hex, :logger_backends, "1.0.0", "09c4fad6202e08cb0fbd37f328282f16539aca380f512523ce9472b28edc6bdf", [:mix], [], "hexpm", "1faceb3e7ec3ef66a8f5746c5afd020e63996df6fd4eb8cdb789e5665ae6c9ce"}, + "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.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [: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", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, "membrane_aac_format": {:hex, :membrane_aac_format, "0.8.0", "515631eabd6e584e0e9af2cea80471fee6246484dbbefc4726c1d93ece8e0838", [:mix], [{:bimap, "~> 1.1", [hex: :bimap, repo: "hexpm", optional: false]}], "hexpm", "a30176a94491033ed32be45e51d509fc70a5ee6e751f12fd6c0d60bd637013f6"}, - "membrane_aac_plugin": {:hex, :membrane_aac_plugin, "0.18.0", "b65697fa31f25ee35520f4f402cfdc6af847bb508f39a3bdd295f117fa1ce59b", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:crc, "~> 0.10.2", [hex: :crc, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "cefaef80e0d1b94ef294127db79f3af0cbc2c691e15c3bb9a4c86bf419839a72"}, - "membrane_cmaf_format": {:hex, :membrane_cmaf_format, "0.7.0", "573bfff6acf2371c5046b9174569f6316f4205e3d6e13e814bf7e613e5653a54", [:mix], [], "hexpm", "4ac6a24a33f61347a2714c982a5f84aa6207641f4de2ad5afde68a8b800da8de"}, - "membrane_common_c": {:hex, :membrane_common_c, "0.16.0", "caf3f29d2f5a1d32d8c2c122866110775866db2726e4272be58e66dfdf4bce40", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:shmex, "~> 0.5.0", [hex: :shmex, repo: "hexpm", optional: false]}, {:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "a3c7e91de1ce1f8b23b9823188a5d13654d317235ea0ca781c05353ed3be9b1c"}, - "membrane_core": {:hex, :membrane_core, "1.0.0", "1b543aefd952283be1f2a215a1db213aa4d91222722ba03cd35280622f1905ee", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "352c90fd0a29942143c4bf7a727cc05c632e323f50a1a4e99321b1e8982f1533"}, - "membrane_file_plugin": {:hex, :membrane_file_plugin, "0.16.0", "7917f6682c22b9bcfc2ca20ed960eee0f7d03ad31fd5f59ed850f1fe3ddd545a", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "b0727998f75a9b4dab8a2baefdfc13c3eac00a04e061ab1b0e61dc5566927acc"}, + "membrane_aac_plugin": {:hex, :membrane_aac_plugin, "0.18.1", "30433bffd4d5d773f79448dd9afd55d77338721688f09a89b20d742a68cc2c3d", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "8fd048c47d5d2949eb557e19f43f62d534d3af5096187f1a1a3a1694d14b772c"}, + "membrane_cmaf_format": {:hex, :membrane_cmaf_format, "0.7.1", "9ea858faefdcb181cdfa8001be827c35c5f854e9809ad57d7062cff1f0f703fd", [:mix], [], "hexpm", "3c7b4ed2a986e27f6f336d2f19e9442cb31d93b3142fc024c019572faca54a73"}, + "membrane_core": {:hex, :membrane_core, "1.0.1", "08aa546c0d131c66f8b906b3dfb2b8f2749b56859f6fc52bd3ac846b944b3baa", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a35ed68561bdf0a2dbb2f994333be78cf4e1c4d734e4cd927d77d92049bb1273"}, + "membrane_file_plugin": {:hex, :membrane_file_plugin, "0.17.0", "e855a848e84eaed537b41fd4436712038fc5518059eadc8609c83cd2d819653a", [:mix], [{:logger_backends, "~> 1.0", [hex: :logger_backends, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "9c3653ca9f13bb409b36257d6094798d4625c739ab7a4035c12308622eb16e0b"}, "membrane_funnel_plugin": {:hex, :membrane_funnel_plugin, "0.9.0", "9cfe09e44d65751f7d9d8d3c42e14797f7be69e793ac112ea63cd224af70a7bf", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "988790aca59d453a6115109f050699f7f45a2eb6a7f8dc5c96392760cddead54"}, - "membrane_h264_ffmpeg_plugin": {:hex, :membrane_h264_ffmpeg_plugin, "0.31.1", "e8915c0712a5614d9b28afe1d39a7db7f053ca2782ef79218f35da4bbc521311", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.3", [hex: :bundlex, repo: "hexpm", optional: false]}, {:membrane_common_c, "~> 0.16.0", [hex: :membrane_common_c, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_raw_video_format, "~> 0.3.0", [hex: :membrane_raw_video_format, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:unifex, "~> 1.1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "32480251d19e1fd75b84c88b6f0b6f21dc8322f48142266a87dbfb188f69a4c9"}, "membrane_h264_format": {:hex, :membrane_h264_format, "0.6.1", "44836cd9de0abe989b146df1e114507787efc0cf0da2368f17a10c47b4e0738c", [:mix], [], "hexpm", "4b79be56465a876d2eac2c3af99e115374bbdc03eb1dea4f696ee9a8033cd4b0"}, - "membrane_h264_plugin": {:hex, :membrane_h264_plugin, "0.9.0", "4b76079489451794c27993fbe6108f10a34068d3034985dc73d601e46266ef90", [:mix], [{:bunch, "~> 1.4", [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]}], "hexpm", "7ecb9fdbe26304a577d9e32895aeee963b0a4bcc01fd77ecd9aebabdafbce58d"}, "membrane_h265_format": {:hex, :membrane_h265_format, "0.2.0", "1903c072cf7b0980c4d0c117ab61a2cd33e88782b696290de29570a7fab34819", [:mix], [], "hexpm", "6df418bdf242c0d9f7dbf2e5aea4c2d182e34ac9ad5a8b8cef2610c290002e83"}, - "membrane_http_adaptive_stream_plugin": {:hex, :membrane_http_adaptive_stream_plugin, "0.18.0", "c83dd7e921dfd595b10e12d85bde313612ece8ca64d6ff27815156b900592d16", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_plugin, "~> 0.18.0", [hex: :membrane_aac_plugin, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h264_plugin, "~> 0.9.0", [hex: :membrane_h264_plugin, repo: "hexpm", optional: false]}, {:membrane_mp4_plugin, "~> 0.31.0", [hex: :membrane_mp4_plugin, repo: "hexpm", optional: false]}, {:membrane_tee_plugin, "~> 0.12.0", [hex: :membrane_tee_plugin, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}], "hexpm", "4e3a1ec9e84892d6f0b115183f4e4f3e202fcefe07aa722f7c2b107cd4403669"}, + "membrane_h26x_plugin": {:hex, :membrane_h26x_plugin, "0.10.1", "d7aeb166da55c6573b2178e18caeea290b09fd6f3cca428454085223e81476a0", [:mix], [{:bunch, "~> 1.4", [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_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}], "hexpm", "9cd63a67ffed0654a932efff34395ded04a05e48d08ea996c93daebf889dac08"}, + "membrane_http_adaptive_stream_plugin": {:hex, :membrane_http_adaptive_stream_plugin, "0.18.4", "f938907eb0e39db2acf8c84e0b770c1976b2793bd58c2e37eca0334dc019f11d", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_plugin, "~> 0.18.0", [hex: :membrane_aac_plugin, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h26x_plugin, "~> 0.10.0", [hex: :membrane_h26x_plugin, repo: "hexpm", optional: false]}, {:membrane_mp4_plugin, "~> 0.34.1", [hex: :membrane_mp4_plugin, repo: "hexpm", optional: false]}, {:membrane_tee_plugin, "~> 0.12.0", [hex: :membrane_tee_plugin, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}], "hexpm", "3f9174faf1f734f1b8507aeea0525384869797e51b88f1b2e33931bae9de32fc"}, "membrane_mp4_format": {:hex, :membrane_mp4_format, "0.8.0", "8c6e7d68829228117d333b4fbb030e7be829aab49dd8cb047fdc664db1812e6a", [:mix], [], "hexpm", "148dea678a1f82ccfd44dbde6f936d2f21255f496cb45a22cc6eec427f025522"}, - "membrane_mp4_plugin": {:hex, :membrane_mp4_plugin, "0.31.0", "1932c86e2f4a24aca1b99ee531a131fd0da1128db8975ba8f8738e3b1bbcfabd", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_cmaf_format, "~> 0.7.0", [hex: :membrane_cmaf_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_file_plugin, "~> 0.16.0", [hex: :membrane_file_plugin, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_h264_plugin, "~> 0.9.0", [hex: :membrane_h264_plugin, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_mp4_format, "~> 0.8.0", [hex: :membrane_mp4_format, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}], "hexpm", "9968e56e02085228974bf6a59c8858f3c0d9800a4e767c1b3b2f2890050c72f4"}, + "membrane_mp4_plugin": {:hex, :membrane_mp4_plugin, "0.34.1", "f34088908b6fae1cb0f9149ddf27fecb8562f97fa81157cf11e7afe3eb86cf7c", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_cmaf_format, "~> 0.7.0", [hex: :membrane_cmaf_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_file_plugin, "~> 0.17.0", [hex: :membrane_file_plugin, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_mp4_format, "~> 0.8.0", [hex: :membrane_mp4_format, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}], "hexpm", "05d53624c63b1b6acb6865e2fd89f7dec713f3b54d82ba541228e1d8f1493b62"}, "membrane_opus_format": {:hex, :membrane_opus_format, "0.3.0", "3804d9916058b7cfa2baa0131a644d8186198d64f52d592ae09e0942513cb4c2", [:mix], [], "hexpm", "8fc89c97be50de23ded15f2050fe603dcce732566fe6fdd15a2de01cb6b81afe"}, - "membrane_protocol_sdp": {:hex, :membrane_protocol_sdp, "0.1.1", "86957c82ba53ac6fde696c99e9bc5c0c151183b668a1bff0ded9e2e0df5ed93b", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}], "hexpm", "36b66f761cba9afae72c4f284101636952d5f78bf73341c0a40a556eccc0c50a"}, - "membrane_raw_video_format": {:hex, :membrane_raw_video_format, "0.3.0", "ba10f475e0814a6fe79602a74536b796047577c7ef5b0e33def27cd344229699", [:mix], [], "hexpm", "2f08760061c8a5386ecf04273480f10e48d25a1a40aa99476302b0bcd34ccb1c"}, "membrane_realtimer_plugin": {:hex, :membrane_realtimer_plugin, "0.9.0", "27210d5e32a5e8bfd101c41e4d8c1876e873a52cc129ebfbee4d0ccbea1cbd21", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "b2e96d62135ee57ef9a5fdea94b3a9ab1198e5ea8ee248391b89c671125d1b51"}, "membrane_rtp_format": {:hex, :membrane_rtp_format, "0.8.0", "828924bbd27efcf85b2015ae781e824c4a9928f0a7dc132abc66817b2c6edfc4", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "bc75d2a649dfaef6df563212fbb9f9f62eebc871393692f9dae8d289bd4f94bb"}, "membrane_rtp_h264_plugin": {:hex, :membrane_rtp_h264_plugin, "0.19.0", "112bfedc14fb83bdb549ef1a03da23908feedeb165fd3e4512a549f1af532ae7", [: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", "76fd159e7406cadbef15124cba30eca3fffcf71a7420964f26e23d4cffd9b29d"}, - "membrane_rtp_plugin": {:hex, :membrane_rtp_plugin, "0.24.0", "491e00f377dccfad67747a5669d933f21331b43d8d2ee3fbfc451b5404b82344", [: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", "c0d12248d7def316cdc2c807b3b3022104bd9cddb47a13ae200420186295e8ab"}, - "membrane_rtsp": {:hex, :membrane_rtsp, "0.5.0", "29ff82df4596118d104c3a8a5c658266fe4977bcca8accbd4df11aa953a12094", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.11.0", [hex: :ex_sdp, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "3b218648c8beb21e0bc6ccd15ebb853a92c28f34dfaa3b03ee2e58ae89e44471"}, + "membrane_rtp_plugin": {:hex, :membrane_rtp_plugin, "0.27.1", "bee67c272f2ba252a98e302c251dfa04fa4e061f154e6112f154d5eb58d6b199", [: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_rtsp, "~> 0.6.0", [hex: :membrane_rtsp, 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", "61410fa44b71d6bc4c31cbb2c832417bc71f5f2bf9a29337536b12ec089614b5"}, + "membrane_rtsp": {:hex, :membrane_rtsp, "0.6.2", "782050a1dd604721647c984741c85ed0b6eaf1b0940fbdaab459a267c6dca71c", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.15.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", "d2f9aae6d81aeb6df35d2f45f2f99414473e5bf978b554930a25c6fb89311e80"}, "membrane_tee_plugin": {:hex, :membrane_tee_plugin, "0.12.0", "f94989b4080ef4b7937d74c1a14d3379577c7bd4c6d06e5a2bb41c351ad604d4", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "0d61c9ed5e68e5a75d54200e1c6df5739c0bcb52fee0974183ad72446a179887"}, "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.12.0", "f3930a592f975f5aef924ff70b1072e55451de16ec5dce7dd264ecf9d034b9ad", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "65e846f7523e443215b6954136971d4f00a8e8f375ef015153daa535ce607769"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "mint": {:hex, :mint, "1.5.1", "8db5239e56738552d85af398798c80648db0e90f343c8469f6c6d8898944fb6f", [: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", "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e"}, + "membrane_udp_plugin": {:hex, :membrane_udp_plugin, "0.13.0", "c4d10b4cb152a95779e36fac4338e11ef0b0cb545c78ca337d7676f6df5d5709", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "47a1661038ef65025fe36cfcae8ce23c022f9dc0867b8340c46dd4963f5a1bcb"}, "mockery": {:hex, :mockery, "2.3.1", "a02fd60b10ac9ed37a7a2ecf6786c1f1dd5c75d2b079a60594b089fba32dc087", [:mix], [], "hexpm", "1d0971d88ebf084e962da3f2cfee16f0ea8e04ff73a7710428500d4500b947fa"}, - "nimble_options": {:hex, :nimble_options, "1.0.2", "92098a74df0072ff37d0c12ace58574d26880e522c22801437151a159392270e", [:mix], [], "hexpm", "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"}, + "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"}, "qex": {:hex, :qex, "0.5.1", "0d82c0f008551d24fffb99d97f8299afcb8ea9cf99582b770bd004ed5af63fd6", [:mix], [], "hexpm", "935a39fdaf2445834b95951456559e9dc2063d0a055742c558a99987b38d6bab"}, "ratio": {:hex, :ratio, "3.0.2", "60a5976872a4dc3d873ecc57eed1738589e99d1094834b9c935b118231297cfb", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:numbers, "~> 5.2.0", [hex: :numbers, repo: "hexpm", optional: false]}], "hexpm", "3a13ed5a30ad0bfd7e4a86bf86d93d2b5a06f5904417d38d3f3ea6406cdfc7bb"}, - "req": {:hex, :req, "0.4.5", "2071bbedd280f107b9e33e1ddff2beb3991ec1ae06caa2cca2ab756393d8aca5", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.9", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "dd23e9c7303ddeb2dee09ff11ad8102cca019e38394456f265fb7b9655c64dd8"}, - "secure_random": {:hex, :secure_random, "0.5.1", "c5532b37c89d175c328f5196a0c2a5680b15ebce3e654da37129a9fe40ebf51b", [:mix], [], "hexpm", "1b9754f15e3940a143baafd19da12293f100044df69ea12db5d72878312ae6ab"}, - "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"}, - "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, - "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"}, - "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, - "zarex": {:hex, :zarex, "1.0.3", "a9e9527a1c31df7f39499819bd76ccb15b0b4e479eed5a4a40db9df7ad7db25c", [:mix], [], "hexpm", "4400a7d33bbf222383ce9a3d5ec9411798eb2b12e86c65ad8e6ac08d8116ca8b"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, } From 4a7c160bddd85dfcea38576dc27927163203e392 Mon Sep 17 00:00:00 2001 From: noarkhh Date: Thu, 18 Apr 2024 14:33:31 +0200 Subject: [PATCH 2/6] Use membrane_rtsp_plugin in rtsp_to_hls demo --- rtsp_to_hls/lib/connection_manager.ex | 2 +- rtsp_to_hls/lib/pipeline.ex | 161 +++++++++++++++----------- rtsp_to_hls/mix.exs | 10 +- rtsp_to_hls/mix.lock | 6 +- 4 files changed, 104 insertions(+), 75 deletions(-) diff --git a/rtsp_to_hls/lib/connection_manager.ex b/rtsp_to_hls/lib/connection_manager.ex index 74dbbbfa..ac9b1720 100644 --- a/rtsp_to_hls/lib/connection_manager.ex +++ b/rtsp_to_hls/lib/connection_manager.ex @@ -6,7 +6,7 @@ defmodule Membrane.Demo.RtspToHls.ConnectionManager do alias Membrane.RTSP - @delay 15_000 + @delay 1_000 @keep_alive_interval 15_000 defmodule ConnectionStatus do diff --git a/rtsp_to_hls/lib/pipeline.ex b/rtsp_to_hls/lib/pipeline.ex index fad56883..c6ba9c68 100644 --- a/rtsp_to_hls/lib/pipeline.ex +++ b/rtsp_to_hls/lib/pipeline.ex @@ -13,91 +13,122 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do def handle_init(_context, options) do Logger.debug("Source handle_init options: #{inspect(options)}") - connection_manager_spec = [ - %{ - id: "ConnectionManager", - start: - {ConnectionManager, :start_link, - [ - [ - stream_url: options.stream_url, - port: options.port, - pipeline: self() - ] - ]}, - restart: :transient - } - ] - - Supervisor.start_link(connection_manager_spec, - strategy: :one_for_one, - name: Membrane.Demo.RtspToHls.Supervisor - ) - - {[], - %{ - video: nil, - port: options.port, - output_path: options.output_path, - parent_pid: options.parent_pid - }} - end - - @impl true - def handle_info({:rtsp_setup_complete, options}, _ctx, state) do - Logger.debug("Source received pipeline options: #{inspect(options)}") - - structure = [ - child( - :app_source, - %Membrane.UDP.Source{ - local_port_no: state[:port], - recv_buffer_size: 500_000 - } - ) - |> via_in(:rtp_input) - |> child( - :rtp, - %Membrane.RTP.SessionBin{ - fmt_mapping: %{96 => {:H264, 90_000}} - } - ), + spec = [ + child(:source, %Membrane.RTSP.Source{ + transport: :tcp, + allowed_media_types: [:video], + stream_uri: options.stream_url + }), child( :hls, %Membrane.HTTPAdaptiveStream.SinkBin{ target_window_duration: Membrane.Time.seconds(120), manifest_module: Membrane.HTTPAdaptiveStream.HLS, storage: %Membrane.HTTPAdaptiveStream.Storages.FileStorage{ - directory: state[:output_path] + directory: options.output_path } } ) ] - {[spec: structure], %{state | video: %{sps: options[:sps], pps: options[:pps]}}} + # connection_manager_spec = [ + # %{ + # id: "ConnectionManager", + # start: + # {ConnectionManager, :start_link, + # [ + # [ + # stream_url: options.stream_url, + # port: options.port, + # pipeline: self() + # ] + # ]}, + # restart: :transient + # } + # ] + + # Supervisor.start_link(connection_manager_spec, + # strategy: :one_for_one, + # name: Membrane.Demo.RtspToHls.Supervisor + # ) + + {[spec: spec], + %{ + video: nil, + port: options.port, + output_path: options.output_path, + parent_pid: options.parent_pid + }} + + # {[spec: spec], options} end + # @impl true + # def handle_info({:rtsp_setup_complete, options}, _ctx, state) do + # Logger.debug("Source received pipeline options: #{inspect(options)}") + + # structure = [ + # child( + # :app_source, + # %Membrane.UDP.Source{ + # local_port_no: state[:port], + # recv_buffer_size: 500_000 + # } + # ) + # |> via_in(:rtp_input) + # |> child( + # :rtp, + # %Membrane.RTP.SessionBin{ + # fmt_mapping: %{96 => {:H264, 90_000}} + # } + # ), + # child( + # :hls, + # %Membrane.HTTPAdaptiveStream.SinkBin{ + # target_window_duration: Membrane.Time.seconds(120), + # manifest_module: Membrane.HTTPAdaptiveStream.HLS, + # storage: %Membrane.HTTPAdaptiveStream.Storages.FileStorage{ + # directory: state[:output_path] + # } + # } + # ) + # ] + + # {[spec: structure], %{state | video: %{sps: options[:sps], pps: options[:pps]}}} + # end + @impl true - def handle_child_notification({:new_rtp_stream, ssrc, 96, _extensions}, :rtp, _ctx, state) do + def handle_child_notification({:new_track, ssrc, track}, :source, _ctx, state) do Logger.debug(":new_rtp_stream") + IO.inspect(track, label: "track") - spss = - case state.video.sps do - <<>> -> [] - sps -> [sps] + {spss, ppss} = + case track.fmtp.sprop_parameter_sets do + nil -> {[], []} + parameter_sets -> {parameter_sets.sps, parameter_sets.pps} end - ppss = - case state.video.pps do - <<>> -> [] - pps -> [pps] - end + # spss = + # case state.video.sps do + # <<>> -> [] + # sps -> [sps] + # end + + # ppss = + # case state.video.pps do + # <<>> -> [] + # pps -> [pps] + # end + # spss = [] + # ppss = [] structure = - get_child(:rtp) - |> via_out(Pad.ref(:output, ssrc), - options: [depayloader: Membrane.RTP.H264.Depayloader] + get_child(:source) + |> via_out( + Pad.ref(:output, ssrc) + # options: [depayloader: Membrane.RTP.H264.Depayloader] ) + # |> child(:depayloader, Membrane.RTP.H264.Depayloader) |> child( :video_nal_parser, %Membrane.H264.Parser{ @@ -120,7 +151,7 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do end @impl true - def handle_child_notification({:new_rtp_stream, ssrc, _payload_type, _list}, :rtp, _ctx, state) do + def handle_child_notification({:new_track, ssrc, _track}, :source, _ctx, state) do Logger.warning("new_rtp_stream Unsupported stream connected") structure = diff --git a/rtsp_to_hls/mix.exs b/rtsp_to_hls/mix.exs index 78bd13fa..cf83df9b 100644 --- a/rtsp_to_hls/mix.exs +++ b/rtsp_to_hls/mix.exs @@ -31,13 +31,9 @@ defmodule Membrane.Demo.RtspToHls.MixProject do {:dialyxir, ">= 0.0.0", only: :dev, runtime: false}, {:credo, ">= 0.0.0", only: :dev, runtime: false}, {:connection, "~> 1.1"}, - {:membrane_rtsp, "~> 0.6.2"}, - {:membrane_udp_plugin, "~> 0.13.0"}, - {:membrane_rtp_plugin, "~> 0.27.1"}, - {:membrane_rtp_h264_plugin, "~> 0.19.0"}, - {:membrane_http_adaptive_stream_plugin, "~> 0.18.4"}, - {:membrane_h26x_plugin, "~> 0.10.1"}, - {:membrane_realtimer_plugin, "~> 0.9.0"} + {:membrane_http_adaptive_stream_plugin, "~> 0.18.0"}, + {:membrane_realtimer_plugin, "~> 0.9.0"}, + {:membrane_rtsp_plugin, path: "../../membrane_rtsp_plugin"} ] end diff --git a/rtsp_to_hls/mix.lock b/rtsp_to_hls/mix.lock index 6775a931..e2743815 100644 --- a/rtsp_to_hls/mix.lock +++ b/rtsp_to_hls/mix.lock @@ -34,8 +34,10 @@ "membrane_realtimer_plugin": {:hex, :membrane_realtimer_plugin, "0.9.0", "27210d5e32a5e8bfd101c41e4d8c1876e873a52cc129ebfbee4d0ccbea1cbd21", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "b2e96d62135ee57ef9a5fdea94b3a9ab1198e5ea8ee248391b89c671125d1b51"}, "membrane_rtp_format": {:hex, :membrane_rtp_format, "0.8.0", "828924bbd27efcf85b2015ae781e824c4a9928f0a7dc132abc66817b2c6edfc4", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "bc75d2a649dfaef6df563212fbb9f9f62eebc871393692f9dae8d289bd4f94bb"}, "membrane_rtp_h264_plugin": {:hex, :membrane_rtp_h264_plugin, "0.19.0", "112bfedc14fb83bdb549ef1a03da23908feedeb165fd3e4512a549f1af532ae7", [: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", "76fd159e7406cadbef15124cba30eca3fffcf71a7420964f26e23d4cffd9b29d"}, - "membrane_rtp_plugin": {:hex, :membrane_rtp_plugin, "0.27.1", "bee67c272f2ba252a98e302c251dfa04fa4e061f154e6112f154d5eb58d6b199", [: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_rtsp, "~> 0.6.0", [hex: :membrane_rtsp, 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", "61410fa44b71d6bc4c31cbb2c832417bc71f5f2bf9a29337536b12ec089614b5"}, - "membrane_rtsp": {:hex, :membrane_rtsp, "0.6.2", "782050a1dd604721647c984741c85ed0b6eaf1b0940fbdaab459a267c6dca71c", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.15.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", "d2f9aae6d81aeb6df35d2f45f2f99414473e5bf978b554930a25c6fb89311e80"}, + "membrane_rtp_h265_plugin": {:hex, :membrane_rtp_h265_plugin, "0.5.0", "c4009d1ab0d59df659d05a493d4a32bfc5adf6a63cf6e915022db05040e7ab91", [:mix], [{:membrane_core, "~> 1.0.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", "17537a7a4ad39602ccb2b0f37fa5327e5be61f0a3bb2471eda4f381311be0f48"}, + "membrane_rtp_plugin": {:git, "https://github.com/membraneframework/membrane_rtp_plugin.git", "654f4c7d286f56dc3f9884ac5c69173e61e8a46c", [branch: "improve-rtsp-decapsulator"]}, + "membrane_rtsp": {:git, "https://github.com/membraneframework/membrane_rtsp.git", "9fe8b8a3c41a40c427a07713437a871154b0da85", [branch: "expand-length-verification"]}, + "membrane_rtsp_plugin": {:git, "https://github.com/gBillal/membrane_rtsp_plugin.git", "6060a1082829cdb3ec0cf2b7e974101b5a2bc75f", [tag: "v0.1.3"]}, "membrane_tee_plugin": {:hex, :membrane_tee_plugin, "0.12.0", "f94989b4080ef4b7937d74c1a14d3379577c7bd4c6d06e5a2bb41c351ad604d4", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "0d61c9ed5e68e5a75d54200e1c6df5739c0bcb52fee0974183ad72446a179887"}, "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.13.0", "c4d10b4cb152a95779e36fac4338e11ef0b0cb545c78ca337d7676f6df5d5709", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "47a1661038ef65025fe36cfcae8ce23c022f9dc0867b8340c46dd4963f5a1bcb"}, From f6cb6967d15339ae051f4f63f39bbbaa07c098c2 Mon Sep 17 00:00:00 2001 From: noarkhh Date: Thu, 18 Apr 2024 22:46:01 +0200 Subject: [PATCH 3/6] Remove commented code: --- rtsp_to_hls/lib/pipeline.ex | 85 ++----------------------------------- rtsp_to_hls/mix.lock | 1 + 2 files changed, 4 insertions(+), 82 deletions(-) diff --git a/rtsp_to_hls/lib/pipeline.ex b/rtsp_to_hls/lib/pipeline.ex index c6ba9c68..7a4daf57 100644 --- a/rtsp_to_hls/lib/pipeline.ex +++ b/rtsp_to_hls/lib/pipeline.ex @@ -6,16 +6,13 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do require Logger - alias Membrane.Demo.RtspToHls.ConnectionManager - alias Membrane.Pad - @impl true def handle_init(_context, options) do Logger.debug("Source handle_init options: #{inspect(options)}") spec = [ child(:source, %Membrane.RTSP.Source{ - transport: :tcp, + transport: {:udp, options.port, options.port + 5}, allowed_media_types: [:video], stream_uri: options.stream_url }), @@ -31,74 +28,16 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do ) ] - # connection_manager_spec = [ - # %{ - # id: "ConnectionManager", - # start: - # {ConnectionManager, :start_link, - # [ - # [ - # stream_url: options.stream_url, - # port: options.port, - # pipeline: self() - # ] - # ]}, - # restart: :transient - # } - # ] - - # Supervisor.start_link(connection_manager_spec, - # strategy: :one_for_one, - # name: Membrane.Demo.RtspToHls.Supervisor - # ) - {[spec: spec], %{ video: nil, - port: options.port, output_path: options.output_path, parent_pid: options.parent_pid }} - - # {[spec: spec], options} end - # @impl true - # def handle_info({:rtsp_setup_complete, options}, _ctx, state) do - # Logger.debug("Source received pipeline options: #{inspect(options)}") - - # structure = [ - # child( - # :app_source, - # %Membrane.UDP.Source{ - # local_port_no: state[:port], - # recv_buffer_size: 500_000 - # } - # ) - # |> via_in(:rtp_input) - # |> child( - # :rtp, - # %Membrane.RTP.SessionBin{ - # fmt_mapping: %{96 => {:H264, 90_000}} - # } - # ), - # child( - # :hls, - # %Membrane.HTTPAdaptiveStream.SinkBin{ - # target_window_duration: Membrane.Time.seconds(120), - # manifest_module: Membrane.HTTPAdaptiveStream.HLS, - # storage: %Membrane.HTTPAdaptiveStream.Storages.FileStorage{ - # directory: state[:output_path] - # } - # } - # ) - # ] - - # {[spec: structure], %{state | video: %{sps: options[:sps], pps: options[:pps]}}} - # end - @impl true - def handle_child_notification({:new_track, ssrc, track}, :source, _ctx, state) do + def handle_child_notification({:new_track, ssrc, %{type: :video} = track}, :source, _ctx, state) do Logger.debug(":new_rtp_stream") IO.inspect(track, label: "track") @@ -108,27 +47,9 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do parameter_sets -> {parameter_sets.sps, parameter_sets.pps} end - # spss = - # case state.video.sps do - # <<>> -> [] - # sps -> [sps] - # end - - # ppss = - # case state.video.pps do - # <<>> -> [] - # pps -> [pps] - # end - # spss = [] - # ppss = [] - structure = get_child(:source) - |> via_out( - Pad.ref(:output, ssrc) - # options: [depayloader: Membrane.RTP.H264.Depayloader] - ) - # |> child(:depayloader, Membrane.RTP.H264.Depayloader) + |> via_out(Pad.ref(:output, ssrc)) |> child( :video_nal_parser, %Membrane.H264.Parser{ diff --git a/rtsp_to_hls/mix.lock b/rtsp_to_hls/mix.lock index e2743815..ff6a94f6 100644 --- a/rtsp_to_hls/mix.lock +++ b/rtsp_to_hls/mix.lock @@ -38,6 +38,7 @@ "membrane_rtp_plugin": {:git, "https://github.com/membraneframework/membrane_rtp_plugin.git", "654f4c7d286f56dc3f9884ac5c69173e61e8a46c", [branch: "improve-rtsp-decapsulator"]}, "membrane_rtsp": {:git, "https://github.com/membraneframework/membrane_rtsp.git", "9fe8b8a3c41a40c427a07713437a871154b0da85", [branch: "expand-length-verification"]}, "membrane_rtsp_plugin": {:git, "https://github.com/gBillal/membrane_rtsp_plugin.git", "6060a1082829cdb3ec0cf2b7e974101b5a2bc75f", [tag: "v0.1.3"]}, + "membrane_tcp_plugin": {:hex, :membrane_tcp_plugin, "0.2.0", "b7eb928b6879570051660a6e71582a69e03adda07d303a3502a7453476de93dd", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "1868fef575b43c03f60ddb555d6475bfe65262656378e2be18f11bb62c8db6dc"}, "membrane_tee_plugin": {:hex, :membrane_tee_plugin, "0.12.0", "f94989b4080ef4b7937d74c1a14d3379577c7bd4c6d06e5a2bb41c351ad604d4", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "0d61c9ed5e68e5a75d54200e1c6df5739c0bcb52fee0974183ad72446a179887"}, "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.13.0", "c4d10b4cb152a95779e36fac4338e11ef0b0cb545c78ca337d7676f6df5d5709", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "47a1661038ef65025fe36cfcae8ce23c022f9dc0867b8340c46dd4963f5a1bcb"}, From 7224f29807e61cb6047aa681b4672e437348b5c9 Mon Sep 17 00:00:00 2001 From: noarkhh Date: Fri, 14 Jun 2024 12:43:56 +0200 Subject: [PATCH 4/6] Use released rtsp_plugin --- rtsp_to_hls/lib/connection_manager.ex | 281 -------------------------- rtsp_to_hls/lib/pipeline.ex | 1 - rtsp_to_hls/mix.exs | 2 +- rtsp_to_hls/mix.lock | 28 +-- 4 files changed, 15 insertions(+), 297 deletions(-) delete mode 100644 rtsp_to_hls/lib/connection_manager.ex diff --git a/rtsp_to_hls/lib/connection_manager.ex b/rtsp_to_hls/lib/connection_manager.ex deleted file mode 100644 index ac9b1720..00000000 --- a/rtsp_to_hls/lib/connection_manager.ex +++ /dev/null @@ -1,281 +0,0 @@ -defmodule Membrane.Demo.RtspToHls.ConnectionManager do - @moduledoc false - use Connection - - require Logger - - alias Membrane.RTSP - - @delay 1_000 - @keep_alive_interval 15_000 - - defmodule ConnectionStatus do - @moduledoc false - @type t :: %__MODULE__{ - stream_url: binary(), - rtsp_session: pid(), - pipeline: pid(), - keep_alive: pid(), - pipeline_options: keyword() - } - - @enforce_keys [ - :stream_url, - :pipeline, - :pipeline_options - ] - - defstruct @enforce_keys ++ - [ - :rtsp_session, - :keep_alive - ] - end - - @spec start_link(Keyword.t()) :: GenServer.on_start() - def start_link(args) do - Logger.debug("ConnectionManager: start_link, args: #{inspect(args)}") - - Connection.start_link(__MODULE__, args, name: ConnectionManager) - end - - @impl true - def init(stream_url: stream_url, port: port, pipeline: pipeline) do - Logger.debug("ConnectionManager: Initializing") - - {:connect, :init, - %ConnectionStatus{ - stream_url: stream_url, - pipeline_options: [ - port: port, - sps: nil, - pps: nil, - control: nil - ], - pipeline: pipeline - }} - end - - @impl true - def connect(_info, %ConnectionStatus{} = connection_status) do - Logger.debug("ConnectionManager: Connecting") - - rtsp_session = start_rtsp_session(connection_status) - connection_status = %{connection_status | rtsp_session: rtsp_session} - - if is_nil(rtsp_session) do - {:backoff, @delay, connection_status} - else - with {:ok, connection_status} <- - get_rtsp_description(connection_status), - :ok <- setup_rtsp_connection(connection_status), - {:ok, connection_status} <- start_keep_alive(connection_status), - :ok <- play(connection_status) do - Logger.warning(~s""" - ConnectionManager processes: - RTSP session: #{inspect(connection_status.rtsp_session)}, - Membrane Pipeline: #{inspect(connection_status.pipeline)}, - RTSP keep alive: #{inspect(connection_status.keep_alive)} - """) - - send( - connection_status.pipeline, - {:rtsp_setup_complete, connection_status.pipeline_options} - ) - - {:ok, connection_status} - else - {:error, error_message} -> - Logger.warning("ConnectionManager: Connection failed: #{inspect(error_message)}") - {:backoff, @delay, connection_status} - end - end - end - - @impl true - def disconnect(message, %ConnectionStatus{} = connection_status) do - Logger.debug("ConnectionManager: Disconnecting: #{message}") - - kill_children(connection_status) - - connection_status = %{ - connection_status - | rtsp_session: nil, - keep_alive: nil - } - - case message do - :reload -> - {:connect, :reload, connection_status} - - {:error, error_message} -> - Logger.error("ConnectionManager: Error: #{inspect(error_message)}") - {:backoff, @delay, connection_status} - end - end - - defp kill_children(%ConnectionStatus{keep_alive: keep_alive, rtsp_session: rtsp_session}) do - if !is_nil(keep_alive) and Process.alive?(keep_alive), do: GenServer.stop(keep_alive, :normal) - - if !is_nil(rtsp_session) and Process.alive?(rtsp_session), do: RTSP.close(rtsp_session) - end - - @impl true - def handle_info( - {:DOWN, _ref, :process, pid, reason}, - %ConnectionStatus{ - rtsp_session: rtsp_session, - keep_alive: keep_alive - } = connection_status - ) - when reason != :normal do - Logger.warning("ConnectionManager: Received DOWN message from #{inspect(pid)}") - - Logger.warning(~s""" - ConnectionManager processes: - RTSP session: #{inspect(rtsp_session)}, - RTSP keep alive: #{inspect(keep_alive)} - """) - - case pid do - ^rtsp_session -> - Logger.error("ConnectionManager: RTSP session crashed") - - ^keep_alive -> - Logger.error("ConnectionManager: Keep_alive process crashed") - - process -> - Logger.error("ConnectionManager: #{process} process crashed") - end - - {:disconnect, :reload, connection_status} - end - - @impl true - def handle_info({:DOWN, _ref, :process, _pid, reason}, connection_status) - when reason == :normal do - {:noreply, connection_status} - end - - @impl true - def handle_info({:EXIT, _from, reason}, connection_status) do - {:disconnect, {:error, reason}, connection_status} - end - - defp start_rtsp_session(%ConnectionStatus{rtsp_session: nil, stream_url: stream_url}) do - case RTSP.start(stream_url) do - {:ok, session} -> - Process.monitor(session) - session - - {:error, error} -> - Logger.warning("ConnectionManager: Starting RTSP session failed - #{inspect(error)}") - nil - end - end - - defp start_rtsp_session(%ConnectionStatus{rtsp_session: rtsp_session}) do - rtsp_session - end - - defp get_rtsp_description(%ConnectionStatus{rtsp_session: rtsp_session} = connection_status) do - Logger.debug("ConnectionManager: Setting up RTSP description") - - case RTSP.describe(rtsp_session) do - {:ok, %{status: 200, body: %{media: sdp_media}}} -> - attributes = get_video_attributes(sdp_media) - - get_sps_pps(attributes) - |> Keyword.put(:control, attributes["control"]) - |> then( - &{:ok, - Map.update(connection_status, :pipeline_options, [], fn pipeline_options -> - Keyword.merge(pipeline_options, &1) - end)} - ) - - _result -> - {:error, :getting_rtsp_description_failed} - end - end - - defp setup_rtsp_connection(%ConnectionStatus{ - rtsp_session: rtsp_session, - pipeline_options: pipeline_options - }) do - Logger.debug("ConnectionManager: Setting up RTSP connection") - - case RTSP.setup(rtsp_session, "#{pipeline_options[:control]}", [ - {"Transport", "RTP/AVP;unicast;client_port=#{pipeline_options[:port]}"} - ]) do - {:ok, %{status: 200}} -> - :ok - - result -> - Logger.debug("ConnectionManager: Setting up RTSP connection failed: #{inspect(result)}") - - {:error, :setting_up_sdp_connection_failed} - end - end - - defp play(%ConnectionStatus{rtsp_session: rtsp_session}) do - Logger.debug("ConnectionManager: Setting RTSP on play mode") - - case RTSP.play(rtsp_session) do - {:ok, %{status: 200}} -> - :ok - - _result -> - {:error, :play_rtsp_failed} - end - end - - defp start_keep_alive(%ConnectionStatus{rtsp_session: rtsp_session} = connection_status) do - Logger.debug("ConnectionManager: Starting Keep alive process") - - {:ok, keep_alive} = - Task.start(fn -> - rtsp_keep_alive(rtsp_session) - end) - - Process.monitor(keep_alive) - - {:ok, %{connection_status | keep_alive: keep_alive}} - end - - defp rtsp_keep_alive(rtsp_session) do - case RTSP.get_parameter(rtsp_session) do - {:ok, %RTSP.Response{status: 200}} -> - Process.sleep(@keep_alive_interval) - rtsp_keep_alive(rtsp_session) - - error -> - Logger.warning("RTSP ping failed: #{inspect(error)}") - Process.exit(self(), :connection_failed) - end - end - - defp get_sps_pps(%{ExSDP.Attribute.FMTP => fmtp}) do - {sps, pps} = - case fmtp.sprop_parameter_sets do - nil -> {<<>>, <<>>} - parameter_sets -> {parameter_sets.sps, parameter_sets.pps} - end - - [sps: sps, pps: pps] - end - - defp get_video_attributes(sdp_media) do - video_protocol = sdp_media |> Enum.find(fn elem -> elem.type == :video end) - - Map.fetch!(video_protocol, :attributes) - |> Enum.map(fn - %module{} = attribute -> - {module, attribute} - - {key, value} -> - {key, value} - end) - |> Enum.into(%{}) - end -end diff --git a/rtsp_to_hls/lib/pipeline.ex b/rtsp_to_hls/lib/pipeline.ex index 7a4daf57..774d373d 100644 --- a/rtsp_to_hls/lib/pipeline.ex +++ b/rtsp_to_hls/lib/pipeline.ex @@ -39,7 +39,6 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do @impl true def handle_child_notification({:new_track, ssrc, %{type: :video} = track}, :source, _ctx, state) do Logger.debug(":new_rtp_stream") - IO.inspect(track, label: "track") {spss, ppss} = case track.fmtp.sprop_parameter_sets do diff --git a/rtsp_to_hls/mix.exs b/rtsp_to_hls/mix.exs index cf83df9b..ea2958c8 100644 --- a/rtsp_to_hls/mix.exs +++ b/rtsp_to_hls/mix.exs @@ -33,7 +33,7 @@ defmodule Membrane.Demo.RtspToHls.MixProject do {:connection, "~> 1.1"}, {:membrane_http_adaptive_stream_plugin, "~> 0.18.0"}, {:membrane_realtimer_plugin, "~> 0.9.0"}, - {:membrane_rtsp_plugin, path: "../../membrane_rtsp_plugin"} + {:membrane_rtsp_plugin, "~> 0.2.0"} ] end diff --git a/rtsp_to_hls/mix.lock b/rtsp_to_hls/mix.lock index ff6a94f6..fd4b86f6 100644 --- a/rtsp_to_hls/mix.lock +++ b/rtsp_to_hls/mix.lock @@ -4,41 +4,41 @@ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "coerce": {:hex, :coerce, "1.0.1", "211c27386315dc2894ac11bc1f413a0e38505d808153367bd5c6e75a4003d096", [:mix], [], "hexpm", "b44a691700f7a1a15b4b7e2ff1fa30bebd669929ac8aa43cffe9e2f8bf051cf1"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "credo": {:hex, :credo, "1.7.5", "643213503b1c766ec0496d828c90c424471ea54da77c8a168c725686377b9545", [: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", "f799e9b5cd1891577d8c773d245668aa74a2fcd15eb277f51a0131690ebfb3fd"}, + "credo": {:hex, :credo, "1.7.7", "771445037228f763f9b2afd612b6aa2fd8e28432a95dbbc60d8e03ce71ba4446", [: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", "8bc87496c9aaacdc3f90f01b7b0582467b69b4bd2441fe8aae3109d843cc2f2e"}, "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_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.32.1", "21e40f939515373bcdc9cffe65f3b3543f05015ac6c3d01d991874129d173420", [: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", "5142c9db521f106d61ff33250f779807ed2a88620e472ac95dc7d59c380113da"}, + "ex_doc": {:hex, :ex_doc, "0.34.0", "ab95e0775db3df71d30cf8d78728dd9261c355c81382bcd4cefdc74610bef13e", [: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", "60734fb4c1353f270c3286df4a0d51e65a2c1d9fba66af3940847cc65a8066d7"}, "ex_sdp": {:hex, :ex_sdp, "0.15.0", "53815fb5b5e4fae0f3b26de90f372446bb8e0eed62a3cc20394d3c29519698be", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}], "hexpm", "d3f23596b73e7057521ff0f0d55b1189c6320a2f04388aa3a80a0aa97ffb379f"}, "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "heap": {:hex, :heap, "2.0.2", "d98cb178286cfeb5edbcf17785e2d20af73ca57b5a2cf4af584118afbcf917eb", [:mix], [], "hexpm", "ba9ea2fe99eb4bcbd9a8a28eaf71cbcac449ca1d8e71731596aace9028c9d429"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "logger_backends": {:hex, :logger_backends, "1.0.0", "09c4fad6202e08cb0fbd37f328282f16539aca380f512523ce9472b28edc6bdf", [:mix], [], "hexpm", "1faceb3e7ec3ef66a8f5746c5afd020e63996df6fd4eb8cdb789e5665ae6c9ce"}, - "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": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [: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", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.5", "e0ff5a7c708dda34311f7522a8758e23bfcd7d8d8068dc312b5eb41c6fd76eba", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "94d2e986428585a21516d7d7149781480013c56e30c6a233534bedf38867a59a"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.0.0", "6f0eff9c9c489f26b69b61440bf1b238d95badae49adac77973cbacae87e3c2e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "ea7a9307de9d1548d2a72d299058d1fd2339e3d398560a0e46c27dab4891e4d2"}, "membrane_aac_format": {:hex, :membrane_aac_format, "0.8.0", "515631eabd6e584e0e9af2cea80471fee6246484dbbefc4726c1d93ece8e0838", [:mix], [{:bimap, "~> 1.1", [hex: :bimap, repo: "hexpm", optional: false]}], "hexpm", "a30176a94491033ed32be45e51d509fc70a5ee6e751f12fd6c0d60bd637013f6"}, "membrane_aac_plugin": {:hex, :membrane_aac_plugin, "0.18.1", "30433bffd4d5d773f79448dd9afd55d77338721688f09a89b20d742a68cc2c3d", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "8fd048c47d5d2949eb557e19f43f62d534d3af5096187f1a1a3a1694d14b772c"}, "membrane_cmaf_format": {:hex, :membrane_cmaf_format, "0.7.1", "9ea858faefdcb181cdfa8001be827c35c5f854e9809ad57d7062cff1f0f703fd", [:mix], [], "hexpm", "3c7b4ed2a986e27f6f336d2f19e9442cb31d93b3142fc024c019572faca54a73"}, - "membrane_core": {:hex, :membrane_core, "1.0.1", "08aa546c0d131c66f8b906b3dfb2b8f2749b56859f6fc52bd3ac846b944b3baa", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a35ed68561bdf0a2dbb2f994333be78cf4e1c4d734e4cd927d77d92049bb1273"}, + "membrane_core": {:hex, :membrane_core, "1.1.0", "c3bbaa5af7c26a7c3748e573efe343c2104801e3463b9e491a607e82860334a4", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 3.0 or ~> 4.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3209d7f7e86d736cb7caffbba16b075c571cebb9439ab939ed6119c50fb59a5"}, "membrane_file_plugin": {:hex, :membrane_file_plugin, "0.17.0", "e855a848e84eaed537b41fd4436712038fc5518059eadc8609c83cd2d819653a", [:mix], [{:logger_backends, "~> 1.0", [hex: :logger_backends, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "9c3653ca9f13bb409b36257d6094798d4625c739ab7a4035c12308622eb16e0b"}, "membrane_funnel_plugin": {:hex, :membrane_funnel_plugin, "0.9.0", "9cfe09e44d65751f7d9d8d3c42e14797f7be69e793ac112ea63cd224af70a7bf", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "988790aca59d453a6115109f050699f7f45a2eb6a7f8dc5c96392760cddead54"}, "membrane_h264_format": {:hex, :membrane_h264_format, "0.6.1", "44836cd9de0abe989b146df1e114507787efc0cf0da2368f17a10c47b4e0738c", [:mix], [], "hexpm", "4b79be56465a876d2eac2c3af99e115374bbdc03eb1dea4f696ee9a8033cd4b0"}, "membrane_h265_format": {:hex, :membrane_h265_format, "0.2.0", "1903c072cf7b0980c4d0c117ab61a2cd33e88782b696290de29570a7fab34819", [:mix], [], "hexpm", "6df418bdf242c0d9f7dbf2e5aea4c2d182e34ac9ad5a8b8cef2610c290002e83"}, - "membrane_h26x_plugin": {:hex, :membrane_h26x_plugin, "0.10.1", "d7aeb166da55c6573b2178e18caeea290b09fd6f3cca428454085223e81476a0", [:mix], [{:bunch, "~> 1.4", [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_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}], "hexpm", "9cd63a67ffed0654a932efff34395ded04a05e48d08ea996c93daebf889dac08"}, + "membrane_h26x_plugin": {:hex, :membrane_h26x_plugin, "0.10.2", "caf2790d8c107df35f8d456b45f4e09fb9c56ce6c7669a3a03f7d59972e6ed82", [:mix], [{:bunch, "~> 1.4", [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_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}], "hexpm", "becf1ac4a589adecd850137ccd61a33058f686083a514a7e39fcd721bcf9fb2e"}, "membrane_http_adaptive_stream_plugin": {:hex, :membrane_http_adaptive_stream_plugin, "0.18.4", "f938907eb0e39db2acf8c84e0b770c1976b2793bd58c2e37eca0334dc019f11d", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_plugin, "~> 0.18.0", [hex: :membrane_aac_plugin, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h26x_plugin, "~> 0.10.0", [hex: :membrane_h26x_plugin, repo: "hexpm", optional: false]}, {:membrane_mp4_plugin, "~> 0.34.1", [hex: :membrane_mp4_plugin, repo: "hexpm", optional: false]}, {:membrane_tee_plugin, "~> 0.12.0", [hex: :membrane_tee_plugin, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}], "hexpm", "3f9174faf1f734f1b8507aeea0525384869797e51b88f1b2e33931bae9de32fc"}, "membrane_mp4_format": {:hex, :membrane_mp4_format, "0.8.0", "8c6e7d68829228117d333b4fbb030e7be829aab49dd8cb047fdc664db1812e6a", [:mix], [], "hexpm", "148dea678a1f82ccfd44dbde6f936d2f21255f496cb45a22cc6eec427f025522"}, - "membrane_mp4_plugin": {:hex, :membrane_mp4_plugin, "0.34.1", "f34088908b6fae1cb0f9149ddf27fecb8562f97fa81157cf11e7afe3eb86cf7c", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_cmaf_format, "~> 0.7.0", [hex: :membrane_cmaf_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_file_plugin, "~> 0.17.0", [hex: :membrane_file_plugin, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_mp4_format, "~> 0.8.0", [hex: :membrane_mp4_format, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}], "hexpm", "05d53624c63b1b6acb6865e2fd89f7dec713f3b54d82ba541228e1d8f1493b62"}, + "membrane_mp4_plugin": {:hex, :membrane_mp4_plugin, "0.34.2", "6b40c919544dc62e87dd9022083c8e2fafbdc84f5806a475c96076f400ca9500", [:mix], [{:bunch, "~> 1.5", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_aac_format, "~> 0.8.0", [hex: :membrane_aac_format, repo: "hexpm", optional: false]}, {:membrane_cmaf_format, "~> 0.7.0", [hex: :membrane_cmaf_format, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_file_plugin, "~> 0.17.0", [hex: :membrane_file_plugin, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.1", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}, {:membrane_mp4_format, "~> 0.8.0", [hex: :membrane_mp4_format, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}], "hexpm", "70c081524507e849ac37c418ba3d598e00c76b89d0d59e130f45ff8183494192"}, "membrane_opus_format": {:hex, :membrane_opus_format, "0.3.0", "3804d9916058b7cfa2baa0131a644d8186198d64f52d592ae09e0942513cb4c2", [:mix], [], "hexpm", "8fc89c97be50de23ded15f2050fe603dcce732566fe6fdd15a2de01cb6b81afe"}, "membrane_realtimer_plugin": {:hex, :membrane_realtimer_plugin, "0.9.0", "27210d5e32a5e8bfd101c41e4d8c1876e873a52cc129ebfbee4d0ccbea1cbd21", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "b2e96d62135ee57ef9a5fdea94b3a9ab1198e5ea8ee248391b89c671125d1b51"}, "membrane_rtp_format": {:hex, :membrane_rtp_format, "0.8.0", "828924bbd27efcf85b2015ae781e824c4a9928f0a7dc132abc66817b2c6edfc4", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "bc75d2a649dfaef6df563212fbb9f9f62eebc871393692f9dae8d289bd4f94bb"}, - "membrane_rtp_h264_plugin": {:hex, :membrane_rtp_h264_plugin, "0.19.0", "112bfedc14fb83bdb549ef1a03da23908feedeb165fd3e4512a549f1af532ae7", [: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", "76fd159e7406cadbef15124cba30eca3fffcf71a7420964f26e23d4cffd9b29d"}, - "membrane_rtp_h265_plugin": {:hex, :membrane_rtp_h265_plugin, "0.5.0", "c4009d1ab0d59df659d05a493d4a32bfc5adf6a63cf6e915022db05040e7ab91", [:mix], [{:membrane_core, "~> 1.0.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", "17537a7a4ad39602ccb2b0f37fa5327e5be61f0a3bb2471eda4f381311be0f48"}, - "membrane_rtp_plugin": {:git, "https://github.com/membraneframework/membrane_rtp_plugin.git", "654f4c7d286f56dc3f9884ac5c69173e61e8a46c", [branch: "improve-rtsp-decapsulator"]}, - "membrane_rtsp": {:git, "https://github.com/membraneframework/membrane_rtsp.git", "9fe8b8a3c41a40c427a07713437a871154b0da85", [branch: "expand-length-verification"]}, - "membrane_rtsp_plugin": {:git, "https://github.com/gBillal/membrane_rtsp_plugin.git", "6060a1082829cdb3ec0cf2b7e974101b5a2bc75f", [tag: "v0.1.3"]}, - "membrane_tcp_plugin": {:hex, :membrane_tcp_plugin, "0.2.0", "b7eb928b6879570051660a6e71582a69e03adda07d303a3502a7453476de93dd", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "1868fef575b43c03f60ddb555d6475bfe65262656378e2be18f11bb62c8db6dc"}, + "membrane_rtp_h264_plugin": {:hex, :membrane_rtp_h264_plugin, "0.19.1", "8c61b3d2968e54e1b459a42f070ea71f597056eba4059df780eaa8da8aee6035", [: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", "fb2bb5d4ed18f38523851cb449a2c78ed533e58028dc058342b8cfd659f812d5"}, + "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.28.0", "46654f458033a2c5b0c44f528cd6723df4f78705ae64ad0d98bcd58d93b2feda", [: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_rtsp, "~> 0.7.0", [hex: :membrane_rtsp, 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", "6413aebfc6942c38ba71bd19f3fbf6eaa2ba320555d724183350d96ecc153a16"}, + "membrane_rtsp": {:hex, :membrane_rtsp, "0.7.1", "4f54d0d335fe9c2fb6e6e5c10d244db78f7e3ba781b6daf18094c9feff296c6c", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:ex_sdp, "~> 0.15.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", "e47f9cd0caf02730d723dc3785bcce4a1cfafcc3bb0f434c63abb5a5db0f7978"}, + "membrane_rtsp_plugin": {:hex, :membrane_rtsp_plugin, "0.2.0", "27aa2b0e37115c30c782b943fe5071f7c160424d02816a1832cc81e63050b90b", [:mix], [{:membrane_core, "~> 1.1", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h26x_plugin, "~> 0.10.0", [hex: :membrane_h26x_plugin, repo: "hexpm", optional: false]}, {:membrane_rtp_h264_plugin, "~> 0.19.0", [hex: :membrane_rtp_h264_plugin, repo: "hexpm", optional: false]}, {:membrane_rtp_h265_plugin, "~> 0.5.1", [hex: :membrane_rtp_h265_plugin, repo: "hexpm", optional: false]}, {:membrane_rtp_plugin, "~> 0.28.0", [hex: :membrane_rtp_plugin, repo: "hexpm", optional: false]}, {:membrane_rtsp, "~> 0.7.1", [hex: :membrane_rtsp, repo: "hexpm", optional: false]}, {:membrane_tcp_plugin, "~> 0.4.0", [hex: :membrane_tcp_plugin, repo: "hexpm", optional: false]}, {:membrane_udp_plugin, "~> 0.13.0", [hex: :membrane_udp_plugin, repo: "hexpm", optional: false]}], "hexpm", "a060bedf5b67fc8d34f9814b6a4f96fd18b00b4eb717a8c93f1eadd56f3150f9"}, + "membrane_tcp_plugin": {:hex, :membrane_tcp_plugin, "0.4.0", "95a9a2fcbe7c94e3f18b61ef1d35ea07ccb96838185b8c2f2e3ea890a33f3473", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "27df6c36381cbfabf039a6bfd53469e1de61d10cda54f1015d1e4ac12f152834"}, "membrane_tee_plugin": {:hex, :membrane_tee_plugin, "0.12.0", "f94989b4080ef4b7937d74c1a14d3379577c7bd4c6d06e5a2bb41c351ad604d4", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "0d61c9ed5e68e5a75d54200e1c6df5739c0bcb52fee0974183ad72446a179887"}, "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.13.0", "c4d10b4cb152a95779e36fac4338e11ef0b0cb545c78ca337d7676f6df5d5709", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:mockery, "~> 2.3.0", [hex: :mockery, repo: "hexpm", optional: false]}], "hexpm", "47a1661038ef65025fe36cfcae8ce23c022f9dc0867b8340c46dd4963f5a1bcb"}, @@ -46,7 +46,7 @@ "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"}, "qex": {:hex, :qex, "0.5.1", "0d82c0f008551d24fffb99d97f8299afcb8ea9cf99582b770bd004ed5af63fd6", [:mix], [], "hexpm", "935a39fdaf2445834b95951456559e9dc2063d0a055742c558a99987b38d6bab"}, - "ratio": {:hex, :ratio, "3.0.2", "60a5976872a4dc3d873ecc57eed1738589e99d1094834b9c935b118231297cfb", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:numbers, "~> 5.2.0", [hex: :numbers, repo: "hexpm", optional: false]}], "hexpm", "3a13ed5a30ad0bfd7e4a86bf86d93d2b5a06f5904417d38d3f3ea6406cdfc7bb"}, + "ratio": {:hex, :ratio, "4.0.1", "3044166f2fc6890aa53d3aef0c336f84b2bebb889dc57d5f95cc540daa1912f8", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:numbers, "~> 5.2.0", [hex: :numbers, repo: "hexpm", optional: false]}], "hexpm", "c60cbb3ccdff9ffa56e7d6d1654b5c70d9f90f4d753ab3a43a6bf40855b881ce"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, } From 3e47cc8a866f495d7baabd3d01d9d1e1e0b27a2b Mon Sep 17 00:00:00 2001 From: noarkhh Date: Fri, 14 Jun 2024 12:54:54 +0200 Subject: [PATCH 5/6] Remove outdated readme section --- rtsp_to_hls/README.md | 11 ----------- rtsp_to_hls/doc_assets/RTSP_to_HLS_pipeline.png | Bin 61219 -> 0 bytes 2 files changed, 11 deletions(-) delete mode 100644 rtsp_to_hls/doc_assets/RTSP_to_HLS_pipeline.png diff --git a/rtsp_to_hls/README.md b/rtsp_to_hls/README.md index e3fd34a6..78d43e5a 100644 --- a/rtsp_to_hls/README.md +++ b/rtsp_to_hls/README.md @@ -2,17 +2,6 @@ This demo demonstrates receiving the RTSP stream and converting it to the HLS stream. -## Components - -The project consists of 2 parts: - -- The pipeline, which converts the RTP stream to HLS -- Connection Manager, which is started by the pipeline and is responsible for establishing the RTSP connection - -The internal architecture of an application is presented below: - -![Application scheme](doc_assets/RTSP_to_HLS_pipeline.png) - ## Prerequisites and running the demo Below is the instruction for the installation of required dependencies and how to run this demo on various operating systems: diff --git a/rtsp_to_hls/doc_assets/RTSP_to_HLS_pipeline.png b/rtsp_to_hls/doc_assets/RTSP_to_HLS_pipeline.png deleted file mode 100644 index 61c0679b28be0287d2c26b67cf4d4ec01e9ae308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61219 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 Date: Fri, 21 Jun 2024 12:21:42 +0200 Subject: [PATCH 6/6] Fix --- rtsp_to_hls/lib/pipeline.ex | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/rtsp_to_hls/lib/pipeline.ex b/rtsp_to_hls/lib/pipeline.ex index 774d373d..7c890c57 100644 --- a/rtsp_to_hls/lib/pipeline.ex +++ b/rtsp_to_hls/lib/pipeline.ex @@ -32,12 +32,18 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do %{ video: nil, output_path: options.output_path, - parent_pid: options.parent_pid + parent_pid: options.parent_pid, + rtp_started: false }} end @impl true - def handle_child_notification({:new_track, ssrc, %{type: :video} = track}, :source, _ctx, state) do + def handle_child_notification( + {:new_track, ssrc, %{type: :video} = track}, + :source, + _ctx, + %{rtp_started: false} = state + ) do Logger.debug(":new_rtp_stream") {spss, ppss} = @@ -60,14 +66,7 @@ defmodule Membrane.Demo.RtspToHls.Pipeline do |> via_in(:input, options: [encoding: :H264, segment_duration: Membrane.Time.seconds(4)]) |> get_child(:hls) - actions = - if Map.has_key?(state, :rtp_started) do - [] - else - [spec: structure] - end - - {actions, Map.put(state, :rtp_started, true)} + {[spec: structure], %{state | rtp_started: true}} end @impl true