From 107b6937dfe822008787f82485f555d2bb31d60c Mon Sep 17 00:00:00 2001 From: "feliks.pobiedzinski@swmansion.com" Date: Mon, 13 Nov 2023 18:22:22 +0100 Subject: [PATCH] Adjust to core 1.0 API --- lib/membrane_mp4/demuxer/isom.ex | 12 ++-- lib/membrane_mp4/demuxer/isom/samples_info.ex | 2 +- lib/membrane_mp4/helper.ex | 2 +- lib/membrane_mp4/muxer/cmaf.ex | 15 +++-- .../muxer/cmaf/track_samples_queue.ex | 4 +- lib/membrane_mp4/muxer/isom.ex | 7 +- lib/membrane_mp4/track.ex | 4 +- lib/membrane_mp4/track/sample_table.ex | 4 +- mix.exs | 7 +- mix.lock | 31 +++++---- .../fixtures/demuxed_and_depayloaded_video.ms | Bin 119032 -> 113005 bytes test/fixtures/isom/ref_aac.mp4 | Bin 97343 -> 98075 bytes test/fixtures/isom/ref_aac_fast_start.mp4 | Bin 97343 -> 98075 bytes test/fixtures/isom/ref_two_tracks.mp4 | Bin 133520 -> 134252 bytes .../isom/ref_two_tracks_fast_start.mp4 | Bin 133520 -> 134252 bytes .../demuxer/isom/demuxer_test.exs | 13 ++-- .../demuxer/isom/integration_test.exs | 16 ++--- .../demuxer/isom/transmuxing_test.exs | 2 +- .../muxer/cmaf/integration_test.exs | 8 +-- .../muxer/isom/integration_test.exs | 62 +++++++++++------- test/support/buffer_limiter.ex | 11 ++-- .../cmaf/request_media_finalize_sender.ex | 8 +-- 22 files changed, 114 insertions(+), 94 deletions(-) diff --git a/lib/membrane_mp4/demuxer/isom.ex b/lib/membrane_mp4/demuxer/isom.ex index c8bcafb4..e8d8009d 100644 --- a/lib/membrane_mp4/demuxer/isom.ex +++ b/lib/membrane_mp4/demuxer/isom.ex @@ -18,6 +18,7 @@ defmodule Membrane.MP4.Demuxer.ISOM do accepted_format: %RemoteStream{type: :bytestream, content_format: content_format} when content_format in [nil, MP4], + flow_control: :manual, demand_unit: :buffers def_output_pad :output, @@ -34,7 +35,8 @@ defmodule Membrane.MP4.Demuxer.ISOM do }, %Membrane.Opus{self_delimiting?: false} ), - availability: :on_request + availability: :on_request, + flow_control: :manual def_options optimize_for_non_fast_start?: [ default: false, @@ -141,7 +143,7 @@ defmodule Membrane.MP4.Demuxer.ISOM do {[], state} end - def handle_process( + def handle_buffer( :input, _buffer, _ctx, @@ -154,7 +156,7 @@ defmodule Membrane.MP4.Demuxer.ISOM do end @impl true - def handle_process( + def handle_buffer( :input, buffer, ctx, @@ -175,7 +177,7 @@ defmodule Membrane.MP4.Demuxer.ISOM do {buffers ++ redemands, %{state | samples_info: samples_info, partial: rest}} end - def handle_process( + def handle_buffer( :input, buffer, _ctx, @@ -190,7 +192,7 @@ defmodule Membrane.MP4.Demuxer.ISOM do {[], %{state | samples_info: samples_info, partial: rest}} end - def handle_process(:input, buffer, ctx, state) do + def handle_buffer(:input, buffer, ctx, state) do {new_boxes, rest} = Container.parse!(state.partial <> buffer.payload) state = %{ diff --git a/lib/membrane_mp4/demuxer/isom/samples_info.ex b/lib/membrane_mp4/demuxer/isom/samples_info.ex index 7e62eaba..7f9dec7d 100644 --- a/lib/membrane_mp4/demuxer/isom/samples_info.ex +++ b/lib/membrane_mp4/demuxer/isom/samples_info.ex @@ -89,7 +89,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.SamplesInfo do track_id: track_id, sample_composition_offset: sample_composition_offset }) do - use Ratio + use Numbers, overload_operators: true timescale = samples_info.timescales[track_id] {dts, pts} = diff --git a/lib/membrane_mp4/helper.ex b/lib/membrane_mp4/helper.ex index f11230eb..bae56721 100644 --- a/lib/membrane_mp4/helper.ex +++ b/lib/membrane_mp4/helper.ex @@ -7,7 +7,7 @@ defmodule Membrane.MP4.Helper do """ @spec timescalify(Ratio.t() | integer, Ratio.t() | integer) :: integer def timescalify(time, timescale) do - use Ratio + use Numbers, overload_operators: true Ratio.trunc(time * timescale / Time.second() + 0.5) end end diff --git a/lib/membrane_mp4/muxer/cmaf.ex b/lib/membrane_mp4/muxer/cmaf.ex index 31d3666e..2af6dfae 100644 --- a/lib/membrane_mp4/muxer/cmaf.ex +++ b/lib/membrane_mp4/muxer/cmaf.ex @@ -101,6 +101,7 @@ defmodule Membrane.MP4.Muxer.CMAF do def_input_pad :input, availability: :on_request, + flow_control: :manual, demand_unit: :buffers, accepted_format: any_of( @@ -109,7 +110,7 @@ defmodule Membrane.MP4.Muxer.CMAF do %H264{stream_structure: structure, alignment: :au} when H264.is_avc(structure) ) - def_output_pad :output, accepted_format: Membrane.CMAF.Track + def_output_pad :output, accepted_format: Membrane.CMAF.Track, flow_control: :manual def_options segment_min_duration: [ spec: Membrane.Time.t(), @@ -271,8 +272,8 @@ defmodule Membrane.MP4.Muxer.CMAF do end @impl true - def handle_process(Pad.ref(:input, _id) = pad, sample, ctx, state) do - use Ratio, comparison: true + def handle_buffer(Pad.ref(:input, _id) = pad, sample, ctx, state) do + use Numbers, overload_operators: true, comparison: true # In case DTS is not set, use PTS. This is the case for audio tracks or H264 originated # from an RTP stream. ISO base media file format specification uses DTS for calculating @@ -389,7 +390,7 @@ defmodule Membrane.MP4.Muxer.CMAF do end defp generate_segment(acc, ctx, state) do - use Ratio, comparison: true + use Numbers, overload_operators: true, comparison: true tracks_data = acc @@ -510,7 +511,7 @@ defmodule Membrane.MP4.Muxer.CMAF do # Update the duration of the awaiting sample and insert the current sample into the queue defp process_buffer_awaiting_duration(state, pad, sample) do - use Ratio + use Numbers, overload_operators: true prev_sample = state.pad_to_track_data[pad].buffer_awaiting_duration @@ -550,8 +551,8 @@ defmodule Membrane.MP4.Muxer.CMAF do if chunk_target_duration < @min_chunk_duration do raise """ Chunk target duration is smaller than minimal duration. - Duration: #{Membrane.Time.round_to_milliseconds(chunk_target_duration)} - Minumum: #{Membrane.Time.round_to_milliseconds(@min_chunk_duration)} + Duration: #{Membrane.Time.as_milliseconds(chunk_target_duration, :round)} + Minumum: #{Membrane.Time.as_milliseconds(@min_chunk_duration, :round)} """ end diff --git a/lib/membrane_mp4/muxer/cmaf/track_samples_queue.ex b/lib/membrane_mp4/muxer/cmaf/track_samples_queue.ex index 98005477..f553c193 100644 --- a/lib/membrane_mp4/muxer/cmaf/track_samples_queue.ex +++ b/lib/membrane_mp4/muxer/cmaf/track_samples_queue.ex @@ -214,10 +214,10 @@ defmodule Membrane.MP4.Muxer.CMAF.TrackSamplesQueue do """ @spec force_collect(t(), Membrane.Time.t()) :: {[Membrane.Buffer.t()], t()} def force_collect(%__MODULE__{collectable?: false} = queue, max_duration) do - use Ratio, comparison: true + use Numbers, overload_operators: true, comparison: true {excess_samples, target_samples} = - Enum.split_while(queue.target_samples, &(&1.dts > max_duration)) + Enum.split_while(queue.target_samples, &Ratio.gt?(&1.dts, max_duration)) result = Enum.reverse(target_samples) diff --git a/lib/membrane_mp4/muxer/isom.ex b/lib/membrane_mp4/muxer/isom.ex index 7feb2698..1d5262b9 100644 --- a/lib/membrane_mp4/muxer/isom.ex +++ b/lib/membrane_mp4/muxer/isom.ex @@ -12,6 +12,7 @@ defmodule Membrane.MP4.Muxer.ISOM do @mdat_header_size 8 def_input_pad :input, + flow_control: :manual, demand_unit: :buffers, accepted_format: any_of( @@ -28,7 +29,9 @@ defmodule Membrane.MP4.Muxer.ISOM do ), availability: :on_request - def_output_pad :output, accepted_format: %RemoteStream{type: :bytestream, content_format: MP4} + def_output_pad :output, + accepted_format: %RemoteStream{type: :bytestream, content_format: MP4}, + flow_control: :manual def_options fast_start: [ spec: boolean(), @@ -130,7 +133,7 @@ defmodule Membrane.MP4.Muxer.ISOM do end @impl true - def handle_process(Pad.ref(:input, pad_ref), buffer, _ctx, state) do + def handle_buffer(Pad.ref(:input, pad_ref), buffer, _ctx, state) do # In case DTS is not set, use PTS. This is the case for audio tracks or H264 originated # from an RTP stream. ISO base media file format specification uses DTS for calculating # decoding deltas, and so is the implementation of sample table in this plugin. diff --git a/lib/membrane_mp4/track.ex b/lib/membrane_mp4/track.ex index 60ad1d25..b220862c 100644 --- a/lib/membrane_mp4/track.ex +++ b/lib/membrane_mp4/track.ex @@ -43,7 +43,7 @@ defmodule Membrane.MP4.Track do @spec completed?(t()) :: boolean() def completed?(%__MODULE__{} = track) do - use Ratio, comparision: true + use Numbers, overload_operators: true last_dts = track.sample_table.last_dts bound = track.chunk_dts_overbound @@ -143,7 +143,7 @@ defmodule Membrane.MP4.Track do end defp put_durations(track, movie_timescale) do - use Ratio + use Numbers, overload_operators: true duration = track.sample_table.decoding_deltas diff --git a/lib/membrane_mp4/track/sample_table.ex b/lib/membrane_mp4/track/sample_table.ex index eb802945..90e2008f 100644 --- a/lib/membrane_mp4/track/sample_table.ex +++ b/lib/membrane_mp4/track/sample_table.ex @@ -71,7 +71,7 @@ defmodule Membrane.MP4.Track.SampleTable do def chunk_duration(%{chunk_first_dts: nil}), do: 0 def chunk_duration(sample_table) do - use Ratio + use Numbers, overload_operators: true sample_table.last_dts - sample_table.chunk_first_dts end @@ -129,7 +129,7 @@ defmodule Membrane.MP4.Track.SampleTable do defp update_decoding_deltas(sample_table, %Buffer{dts: dts}) do Map.update!(sample_table, :decoding_deltas, fn previous_deltas -> - use Ratio + use Numbers, overload_operators: true new_delta = dts - sample_table.last_dts case previous_deltas do diff --git a/mix.exs b/mix.exs index cf0a3fd3..5efaf914 100644 --- a/mix.exs +++ b/mix.exs @@ -45,11 +45,10 @@ defmodule Membrane.MP4.Plugin.MixProject do {:membrane_h265_format, "~> 0.2.0"}, {:membrane_opus_format, "~> 0.3.0"}, {:membrane_file_plugin, "~> 0.16.0"}, - {:membrane_h264_plugin, "~> 0.7.0"}, + {:membrane_h264_plugin, "~> 0.9.0"}, {:bunch, "~> 1.5"}, - {:membrane_h265_plugin, "~> 0.3.1", only: :test}, - {:membrane_aac_plugin, "~> 0.16.0", only: :test}, - {:membrane_opus_plugin, "~> 0.17.0", only: :test}, + {:membrane_aac_plugin, "~> 0.18.0", only: :test}, + {:membrane_opus_plugin, "~> 0.19.0", only: :test}, {:membrane_stream_plugin, "~> 0.4.0", only: :test}, {:membrane_fake_plugin, "~> 0.11.0", only: :test}, {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, diff --git a/mix.lock b/mix.lock index 0075fc98..b041b835 100644 --- a/mix.lock +++ b/mix.lock @@ -2,8 +2,9 @@ "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.1.1", "e637b79a1eaab1bf019de4100b6db262aa3b660beff0cd2f3617949b1618eeda", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:secure_random, "~> 0.5", [hex: :secure_random, repo: "hexpm", optional: false]}], "hexpm", "1fdfa3d6240baa5a2d5496a86e2e43116f80105e93d9adfd4f1fc75be487ea30"}, + "bundlex": {:hex, :bundlex, "1.2.0", "a89869208a019376a38e8a10e1bd573dcbeae8addd381c2cd74e2817010bef8f", [: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", "d2182b91a2a53847baadf4745ad2291853e786ad28671f474a611e7703dbca9b"}, "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, + "castore": {:hex, :castore, "1.0.4", "ff4d0fb2e6411c0479b1d965a814ea6d00e51eb2f58697446e9c41a97d940b28", [:mix], [], "hexpm", "9418c1b8144e11656f0be99943db4caf04612e3eaecefb5dae9a2a87565584f8"}, "coerce": {:hex, :coerce, "1.0.1", "211c27386315dc2894ac11bc1f413a0e38505d808153367bd5c6e75a4003d096", [:mix], [], "hexpm", "b44a691700f7a1a15b4b7e2ff1fa30bebd669929ac8aa43cffe9e2f8bf051cf1"}, "crc": {:hex, :crc, "0.10.5", "ee12a7c056ac498ef2ea985ecdc9fa53c1bfb4e53a484d9f17ff94803707dfd8", [:mix, :rebar3], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3e673b6495a9525c5c641585af1accba59a1eb33de697bedf341e247012c2c7f"}, "credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"}, @@ -13,32 +14,40 @@ "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "ex_doc": {:hex, :ex_doc, "0.30.6", "5f8b54854b240a2b55c9734c4b1d0dd7bdd41f71a095d42a70445c03cf05a281", [:mix], [{:earmark_parser, "~> 1.4.31", [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", "bd48f2ddacf4e482c727f9293d9498e0881597eae6ddc3d9562bd7923375109f"}, "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"}, + "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, "makeup": {:hex, :makeup, "1.1.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.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"}, "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.16.1", "ea2864a03c47dd3d49a96d7ca6e39a49421ba228fc760fce7e4971b37a202102", [: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, "~> 0.12.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "f7ee9738de777056d9eab864bc120195ccae0986b5cfba79694a1b67d9253579"}, + "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.15.0", "4b6005c562bf025e4a53c95a9646a9f5fa993ac440dd44c1a4d1ea210ec53793", [:mix], [{:membrane_core, "~> 0.12.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", "f9584cca9865ed754b8333e362d49d6c449c708d7c87be6c5f7bd5a1d978d6bf"}, - "membrane_core": {:hex, :membrane_core, "0.12.9", "b80239deacf98f24cfd2e0703b632e92ddded8b989227cd6e724140f433b0aac", [:mix], [{:bunch, "~> 1.6", [hex: :bunch, repo: "hexpm", optional: false]}, {:qex, "~> 0.3", [hex: :qex, repo: "hexpm", optional: false]}, {:ratio, "~> 2.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "389b4b22da0e35d5b053ec2fa87bf36882e0ab88f8fb841af895982fb4abe504"}, - "membrane_fake_plugin": {:hex, :membrane_fake_plugin, "0.10.0", "c30ae33eb1da651f102d23b94c0636366adac5d45b9f727a61fcd515db8be27f", [:mix], [{:membrane_core, "~> 0.12.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "35b2ed4a8f793cdcbcb01ec8d4618358cc41d83bb98d3b804d736be69a121238"}, - "membrane_file_plugin": {:hex, :membrane_file_plugin, "0.15.0", "ddf9535fda82aae5b0688a98de1d02268287ffc8bcc6dba1a85e057d71c522af", [:mix], [{:membrane_core, "~> 0.12.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "fa2f7219f96c9e815475dc0d8c238c0a5648012917584756eb3eee476f737ce2"}, + "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_fake_plugin": {:hex, :membrane_fake_plugin, "0.11.0", "3a2d26f15ad4940a4d44cee3354dff38fa9a39963e9b2dcb49802e150ff9a9dc", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "7c6b6a06eaa4e820d1e4836510ddb4bcb386c8918d0b37542a21caf6b87cbe72"}, + "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_h264_format": {:hex, :membrane_h264_format, "0.6.1", "44836cd9de0abe989b146df1e114507787efc0cf0da2368f17a10c47b4e0738c", [:mix], [], "hexpm", "4b79be56465a876d2eac2c3af99e115374bbdc03eb1dea4f696ee9a8033cd4b0"}, - "membrane_h264_plugin": {:hex, :membrane_h264_plugin, "0.7.3", "c558137cdfe72ca68a1bcf05d30cfd1bdc2264a3fbea0b002e9682a6832efc7d", [:mix], [{:bunch, "~> 1.4", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 0.12.7", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h264_format, "~> 0.6.0", [hex: :membrane_h264_format, repo: "hexpm", optional: false]}], "hexpm", "291b0b5ed07e0e39ec0369f6a3d47a189544ddb62ce2b7a1443742beb6618992"}, + "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_h265_plugin": {:hex, :membrane_h265_plugin, "0.3.1", "486479f67ec90cd84fd78e3de45693305fad67b41ef39d624188a96fdb6c9669", [:mix], [{:bunch, "~> 1.4", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 0.12.0", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_h265_format, "~> 0.2.0", [hex: :membrane_h265_format, repo: "hexpm", optional: false]}], "hexpm", "63b748ac7bb63b2e5145c4f79e061faacfcc4f218b96908e5a9648d6a4f8aca2"}, "membrane_mp4_format": {:hex, :membrane_mp4_format, "0.8.0", "8c6e7d68829228117d333b4fbb030e7be829aab49dd8cb047fdc664db1812e6a", [:mix], [], "hexpm", "148dea678a1f82ccfd44dbde6f936d2f21255f496cb45a22cc6eec427f025522"}, "membrane_opus_format": {:hex, :membrane_opus_format, "0.3.0", "3804d9916058b7cfa2baa0131a644d8186198d64f52d592ae09e0942513cb4c2", [:mix], [], "hexpm", "8fc89c97be50de23ded15f2050fe603dcce732566fe6fdd15a2de01cb6b81afe"}, - "membrane_opus_plugin": {:hex, :membrane_opus_plugin, "0.17.1", "533d694d8c6f38fbf7f09a514e16037e8980d167899d4c35cb5017b088122ce9", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_common_c, "~> 0.15.0", [hex: :membrane_common_c, repo: "hexpm", optional: false]}, {:membrane_core, "~> 0.12.3", [hex: :membrane_core, repo: "hexpm", optional: false]}, {:membrane_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}, {:membrane_raw_audio_format, "~> 0.11.0", [hex: :membrane_raw_audio_format, repo: "hexpm", optional: false]}, {:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "8d2bf3d97651f136fd393ce80c099a4f282bbe1dfafde887f8ab18668fd349aa"}, - "membrane_raw_audio_format": {:hex, :membrane_raw_audio_format, "0.11.0", "9b7e8c77f321a3fa1cac2ef157c897938084b704a90ac5450d9f5c87a249b613", [:mix], [{:bimap, "~> 1.1", [hex: :bimap, repo: "hexpm", optional: false]}, {:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 0.12.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "89e0d46893b7cd63d1ab76467d3aae95bd8081e487b18ab0d1679c70d75f7bd8"}, - "membrane_stream_plugin": {:hex, :membrane_stream_plugin, "0.3.1", "265f327dad815a8ef18f8872bdebc6c1aa1fea3d059446c937b76ff067c166e6", [:mix], [{:membrane_core, "~> 0.12.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "b504296b9f5a78b43c0d46ad66202a1f0f93d4c122949c27ad4c04f67f3c5907"}, + "membrane_opus_plugin": {:hex, :membrane_opus_plugin, "0.19.0", "9b16a047eb4b10224d82ea7b1fbc88a47ae9e246cc371f695b8ba579f48add4b", [:mix], [{:bunch, "~> 1.3", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.2", [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_opus_format, "~> 0.3.0", [hex: :membrane_opus_format, repo: "hexpm", optional: false]}, {:membrane_raw_audio_format, "~> 0.12.0", [hex: :membrane_raw_audio_format, repo: "hexpm", optional: false]}, {:unifex, "~> 1.0", [hex: :unifex, repo: "hexpm", optional: false]}], "hexpm", "79d42c0a0794132950f3b973e11ecbbdf5b3e5bf9dcdde177e50ec5e71a475d2"}, + "membrane_raw_audio_format": {:hex, :membrane_raw_audio_format, "0.12.0", "b574cd90f69ce2a8b6201b0ccf0826ca28b0fbc8245b8078d9f11cef65f7d5d5", [:mix], [{:bimap, "~> 1.1", [hex: :bimap, repo: "hexpm", optional: false]}, {:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "6e6c98e3622a2b9df19eab50ba65d7eb45949b1ba306fa8423df6cdb12fd0b44"}, + "membrane_stream_plugin": {:hex, :membrane_stream_plugin, "0.4.0", "0c4ab72a4e13bf0faa0f1166fbaf68d2e34167dbec345aedb74ce1eb7497bdda", [:mix], [{:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "5a9a9c17783e18ad740e6ddfed364581bdb7ebdab8e61ba2c19a1830356f7eb8"}, + "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"}, + "nimble_options": {:hex, :nimble_options, "1.0.2", "92098a74df0072ff37d0c12ace58574d26880e522c22801437151a159392270e", [:mix], [], "hexpm", "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8"}, "nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"}, + "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"}, "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, "2.4.2", "c8518f3536d49b1b00d88dd20d49f8b11abb7819638093314a6348139f14f9f9", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:numbers, "~> 5.2.0", [hex: :numbers, repo: "hexpm", optional: false]}], "hexpm", "441ef6f73172a3503de65ccf1769030997b0d533b1039422f1e5e0e0b4cbf89e"}, + "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"}, "unifex": {:hex, :unifex, "1.1.0", "26b1bcb6c3b3454e1ea15f85b2e570aaa5b5c609566aa9f5c2e0a8b213379d6b", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}, {:shmex, "~> 0.5.0", [hex: :shmex, repo: "hexpm", optional: false]}], "hexpm", "d8f47e9e3240301f5b20eec5792d1d4341e1a3a268d94f7204703b48da4aaa06"}, + "zarex": {:hex, :zarex, "1.0.3", "a9e9527a1c31df7f39499819bd76ccb15b0b4e479eed5a4a40db9df7ad7db25c", [:mix], [], "hexpm", "4400a7d33bbf222383ce9a3d5ec9411798eb2b12e86c65ad8e6ac08d8116ca8b"}, } diff --git a/test/fixtures/demuxed_and_depayloaded_video.ms b/test/fixtures/demuxed_and_depayloaded_video.ms index e6bdaf3a960339db6c3768845894943f88e30e69..2cfa4c7710f5fdb6fde4355bd90d79779e5f1d96 100644 GIT binary patch literal 113005 zcmd>{by!rF%zfyF)rfP$>~4rI8dAq)Vhjl@w+5MeVHg{`xx0Fpxf>gM-IBDod1B+rqG;h@>I!nSV3FbA z;qpQU+1pq-I#@Wmdm({5ywELOK@JwKAa@HdWJeo&FFf$mEkF*yt9ZCtc-;g!I$At2 z^}=@q*?Sn)$ z!qNQSPYDHR`yZ`F{C~EZ_+OCV76*CTJAup{5D+kMAsDU95im+7q($EP-4I1UKt=%n zgNxi2X%PhZrS-;AFHH+X-9)*(ESi>FYh0O-sZL}Xr<%C8z4HXz094FWW=^gaRP5Z` zRIVI+?2o9}K)hV$e7xXa$gqGPz^bSsDb379C8qTl{77>PGw?4SJ2`vXTUfeNaj>y* zGIOx8LmqAI?(WRb%If9i#o}pWZsBAPa%6FGwPJ<53yZb8gFW~$PR{N&PL6K;RAwMk zkeLuWm8*rN5GR$ng{i%hnVk?jKN~+A6$sq+-fk8`Y)?4(*`Bbob5c222w7V^p>p#u z1*=C?&Tih|r-J`Ab~P7bXJG?B3H%S0gUu5Qb7ROWvV)&t4DRe!7DDViRA$z$P7WY& zhXwx}+^y~HZQQ_$_X)4LnLAjRxi|>1fjL z`0CGv{NB|}$jsG}%E1)O74m0+4}>^4S=gvtAb*Sy8w(FuIzwLg@Bg4DLOgunAGo<& zI16!6**Jq63EUyTZ3uoXkPEo|A+3qk{~PlU3`s5sfKy`Ta+l!;R8K~Z5r2+_bk+3_C|$K5iPWmr3MSrPrm!Jpf#gn z5v1KUe}T;QrBOShj3R?$k3`cenGZvBeu(nosT$gw-nY61-)!PO9Bj2Ap;}-%7zG9jS)rnR5ujSA~0zS1Pn|=Ks73)zuq2 z3=LB8`hMtwrz%tPRiVP#A1j|?-4g@vvGMKu%?zP^uN-l9pB7Ft-uFo$Cg9S3YmS1c zLH7BSUR*!d{<-&_?*UH0Knt0?pu_pmfg}oN?33E{6DFpC)fKy{h#MyTb$C4SC|Sir zSj5|vmtWFV3^vX4vG)d2$oyi*r_HJ3Rgo)KiXzcxLnZ%I+ZFep&wr*EJ0cbb36-?v zqpm&`lsC`7GjWu~4W(W6aevEcPpWcYq+%EWO;bm-2QUF%ewc$9fqt924hh#d-$@^S#f)lk|gYKns zv?dUthaW)aA6&u-LI4(xL z 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 literal 119032 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 lC$Fj)^|LrNj=gHJ8}I$rx6*Gb{iA delta 1868 zcmY+EbyOBs7{-4u3O0xdf(j=rRlEO6?k`xIlKSToqH+1u>d-8!c@ z6LpH+-7{wF*>V4jbAEj1-tXS`KF{;M=bQ7r@1baI`TvL)66oLrlwyo|Nj06gO2{#e1t0DCTmfGREuy`m!BEUq9E0N1phSHr=^>8F$3iG2W2Fv3=`<*F z7|QO3aynaHH7Y!Zimx3|Ny;m$a1~E+9jZP8|4&fu15|$pHC{r1F4RK=rkWC-pJ_3A;09EPY)eXT=7#ZG8g8p4twTm~CSXyZB1WC}EOBtWxBu>vAC zL32IQA{<(_gUI~Q%1>;C)^gECh1w2*c8a{cdfQoA@U2uOc7!Cwo20>+a1!W z61G&swe%q@Q~WVaFiY83emLg@$nV9@sMp_6EW}7ooWKC&Pix za8QXIya0#F!Ebuxu+sTmtvS*Gj%qeiH7Ca;=no}uJP}T4eNv`QRfN+%Vm+Ku5{@*f zJsS?^s=|2_SK&|f`ob!>I0DioDE$LmIt-U3=8BwN4HmcI+IF};3~tEH&79&I+*0A& zDtt!?+&KYv)8O85xUaT7P+J~K%%cQ&tlCea)&HlB;F(lC&n#}j3k}dqMf9o{{N*j4 z!fPe*Mi<^TfOmO>MEs3XiaGlV?Yr#5 zGR?#?hhbTAJM`}^mUSJLZ48#ZIhMo3Y0Oo{+}dL~D`4*WQFK3v<`ffZbi6;iFjej*+7(b_i_E8@^bktbNutyr;S ztay2>L{@PdE4dK!8-kVc$4ciCJFzlSURD>?b}M%YD?baXAcqy@@Qb42BUWh}Rykg5 z!K&=Xs&2;ocVX31vFb8b;~Exl5UZJnIRfWnwU%MEH(__Smbf6m4vkJ zinVDdo?>m^)5hApz}nx$Ivl||uEsh|#yXe8y5taNu&yf7Z3fnTAQlyl_3#q96TJlM W8He=>#d`aSS6Cm3jTw&h9s3WfEv_B_ diff --git a/test/fixtures/isom/ref_aac_fast_start.mp4 b/test/fixtures/isom/ref_aac_fast_start.mp4 index fc97451ef8e13f40142110646c335007cadc98c5..37b936dac256983bff7aa8b1b4b38efda80c9ae4 100644 GIT binary patch delta 2581 zcmcgtJxjw-6us|Z1w|D1yoUhAu9GAr69@gMYxmCEzZ& zO7Rys>DocW_tKo0yyT^AKFo4@-#z!7dtY?HjLi!R<}&_Ly6N_kF;v zfxpl8xYhNq*qKAd)FL(Nb6XC}rZz;wr1ewDoP zkFUBZL+An%4U6!*P8`${!w6{B7n7IGOvuke7&vcz%$N6{J28ZTae;wfHZNeHV_8Ay z==C@UMtKpxe0o9E7)HQ+J$e7d1alsBz&`6z*2^qU+(_bX^{MV(HoXN zll^bX5V}CU0Z!5Wn+Xm78DaltZ2&xAcB1(j7P1wkBB)46jM#*T5qn3F5IeE=-Z2sp31VIqYQ~BYf*P@@z16BciW+TD zLah#4jaYq8+k4J)?)m@o|KI<<-}~L0^f|-fcNu1TJKXoqDK^yM9y}+pm%}Y}&d1gc zx9JHj&EMhHJR#m9Jn)K+iHYXFkAZDX7?UMmR);pU;@|Hb$ysi=I9<+1$MlZ;|KJvI zPlfDL!J{2`x(cmxBtgy?$mIjMbwBq7@LCFa!Xa;M@e=YKh5QLnpbr$R3WYL>>ri+d z6j3ej;^HF|y#mG7fKLPz55|eF2l(EH67!*CBPf+$JcrVU!EZX0=?rE4#5*Xbz48m8 zLKsxkUd1%1bP_60f+~&0C#ZS}s>MO|j!?r_j0698s5u@2MnEl{t*sh$HbCGOCj?1( zT@|i(8G;u>{ngN54>a5bjkZJMP0&OanyNrZ7YLP;(5KMs3^ZQ}EyhC2U}#lXe1O(+ z*hY2QYTfoTv>OKP??J~P=p=)kCA3Rx=-LpvIsKu#tLP0q218Fh(o6C5&Mq!OpH%1@ z1^whAOojTFfdOjyz6+};i7`1;`8yH?!oP!ZZ zAXe{=Yzod%QZl*~jFGCbHDH|D?<@f0vxqeKdK*kw3~{4jVgO81{*!LQH|o&jnJ`7d zr&fn)8N_Uu9tktFp793aC&Em{Fe?yd7ZvYej)cvf2MKaN&s+J=lf(H3VZlgPC{>9$ zgxb4EgR?jek~+YW3PRZ~Jq61W;9EVqTzf0hi{r3z7OYZNk|jD>?p7~=HDR!}7OcxA zZovA@ut9HZY#=mCn-u%zK;{2k2y9V{wkn%#Qog+k?8qu4Y^R26S2FBY`}e4Yd-dpE zP5VAYvwsa7$P5R);CpX4q=7uF`$ww5(Y!*la7;#iNP**WePSh?908})_S1^|^ffr+ zTn=ZY>YQRYUsAk>3zy+X4dKODxKv-fhRcWGC$;-ZFkHNLDw1b?gW8x?-54!oTL@8aS8WJptN z9~8?+iTUIYpH=%y0h~rU{Utrd>)+@R$w|-P{j&)h(}oAy;zZ{n78(ddWu_EvGtfw3|2e{^K}&muoAPdlAW+p z<*?Ejg~a+LVP$$@WmT(eDpqbDR$l80KEkPuifge-QeQb(JjALT!>TUBs&&Mwml02~ z8fP*8VOUKm575N`392<8tKAH%BZq-<7!EmhMM68jF zHC}`@8H+WI$DASUu+VN;v%%s4*8DZr;yu<%1zXEi8*gzRYx@psF9#hmiRW0yt5~O{ zA`R=J2)pWRH#zREIJ)bB9xJe(5m>KStoJyq&t$Bxg!J>m^vkp`#oB)-?QOtDY~T`X z&;%^J9~RL-+`$H)z#?a0LsTRx1RGici*|@BSd8ur>w*n0Ek0u-Qn1*~*hq;TRRJ3v O5VzA~&rS~u3;zd&&8V{g diff --git a/test/fixtures/isom/ref_two_tracks.mp4 b/test/fixtures/isom/ref_two_tracks.mp4 index 7bd5626a42fcdf156eae21e14e9c9fb1f3ce418d..f521073edd68cb55e5e0cda7279354dee03361a4 100644 GIT binary patch delta 509 zcmbO*nd8k2jtv(XC;t{ZH~F*jw#jMwS0>BY?4IoEadYyz;Ej{>7$F%W=n%d+}oE4GoDk~e9b10 zdwYom<4TpyvYr#Tw#&vc+9+?13lZSn9@)V7UU9Qm!gKEJ9*Y=_R5$<42@%>}b(~RO zb+dBAV-98p`J>xczhSKA)l%VOV2Izvz%XeV1H=C53=ALK85kAf7#RJu7#OQH85q|% zF)%(p%)lU|Fg@TGV-l0#p6OeDF$OaUrcdYm&1l6Ws6E~FH)AdzXGd{KNihQ$FzQdg z^N!J&k#V}hd&YbS6;GH)gc7P6maeE#TvD72aWexGkY)s8T__FWYj1z^oADN#8G}V} zNpe0=00g*zSc8GV(t?2@`w0WX++YTV)0GSizqc|lYQ1A%jI?54Y!_f)+&2vX+B2WO delta 2052 zcmY+Cd7RI69><@rF*FQgQj$=Pp)m^4uCq27HCk6o!dk}&xwSL3q4l#QMa~~)l=~cv z^M_x{7`K%(_kGToTtx}3q4u?p_Me@{<2m2Q=kxo1-k;a;y^$U@AsDstph7Wm)k+2r zXK7f%i98kVTwddg1hWdR4p(cT z;?co=h0cZ(hA1yO*z}Qo;l`P2T_RXA>R@<#j&h?yc~S9YLUrp6uM*1bv${&C^^C-d zp+S50$A#ABFOCa;pP+`7!u8whW`%I&1l_Sbt4KKZ+A;l7O5K8TWxD2RS z4;mhWrsbebC+PA9^nD1!DnRkXv{v_(91(LNZOwhPj))nPRybevBVt;nHOW`M`aGGE znwr9Ie*&$9$p5b5Q&Lm9{ck_QPyfdMJ;NOfMw}`XD6}^vwcCK-UepRdk)Ij?r_cP@y<;5j`>&MSX+{w?#!_ z&2<#L85Ny|igiaZHB3G#z6Zs6@6o=f#B=5zdTb$jJO!1EH@~1K4xmyC(32mc(yyYY zN*do$W;rU`1(mC6G6Lx7HRzdaRDLC@FdJ2zfhxU^;w-FkbyTIO$wSX(p?F_fwF641 zgQ~@t_t100(DS2F^~tD)&)1xVUKoyQbwjmnEmu2)t#rZF{4)-$Lywp!S#?)L|d` z^K{hFg8ov@TtS^Irn8-PNk&}@nbRma9d)ytcWR>UG9KK+gL^uGp107ucTlgJsJCnD z<68P!OuxCPzh@5^>HY`yLGM}BU*l0qq&bdK9nt%v&<73C-(roE_|OLi^+bbTL_;ic zh~N9jgZ};j8tQXHPuk6VG^{=PM`@FbhHpe8CZUh}qmhl!C*J?$5*oD@ed@G6tL^?r zN0~!t%slkD`yA^O#@x)!0bjdJ!@8yd4OhnJ!dSM8}P=w;>POdyW0gV(82_?$nh@Pf-o=KwsI| zde^l6GTPv30$JH;<4%-)3~g$THg`l@x}vQfxXrG%yYC&%(9SOCUv{u-Ao{u;+T9TC zDQJ?>URSu!@9wwb1Fqv6UvRLnIf@QlK!@|tk(=nKg&Z4(j=zgexYmin})8> F{|_raGh_e& diff --git a/test/fixtures/isom/ref_two_tracks_fast_start.mp4 b/test/fixtures/isom/ref_two_tracks_fast_start.mp4 index a03f54c5a59f4b839ddfb8947ad84dff1aaecf33..f211b6ddc8eea4484d5c7b36889677cf54f5335e 100644 GIT binary patch delta 490 zcmbO*nd8k2jtNRk@<%tSRP$;%UuIyauV-M`6wSbJKZb!(fQNz6L79Ou_dNsStal8I zXV@8-m^&C4gcK&93**x?4Cbi8I9rto=_vT}CQQEBJ`-ppczX9VpmCgGj^SHOi zhBB^H+02$UfonTk6{C&vX7@q??(I%<8Q&{zHm-fnz1?s>qmk<7XPqHJ+moL#>Z)$$ In)`$U0CTvL6#xJL delta 2041 zcmXAq34F|F9>%}VAX1UIRz=Yg2^G~ArN?$1#aeeOZP8NeY;8r^*j8PG?WL(YW}QpB zyY8UGVBGgDXiAj0>%Py%%|6@BC*PUR`_BLUz0Wb9rxMQJeaVc?e>8U+>bq9*3rGC&g z)Je|<;#!4P$E6l0KCN%xG=K8HANhAdXkL7o*uei+{PrHsiO-D+MrEb-?efuY&!PEH zt{Buj3H1&_^OjbUAG%e8-s50k8!LGNCcgsHFT;#gFmoi#Y5=o~8=uQq40FDOx$R(H zWpf99mSjIMu#1}>^y^^AbL6*r!tEh&rv%)!@O#N{-zFZ|{lmiWD8}4$^#_q=qQG>NFNE@! zMFonPbQCoi1q)6?(Noc5lTe|rQA{c-+zZ9FM{&(ik$|~?ie{l=BT(_ysKj&VchTl3 zD!B+fJ{*;L+Z;#nYf)*hpJ;4yP?-!=b~Gy27d_b&Jr!e4q4E<@g*1XnsE#Ven(Zjj zs*<{)N_EX0RCzCYdN!&u3?;WjRpZS`^o%d9=Dla%LeG^n$I$a5QFV*1VRtpopqfk3 z3*Vwzolxzn<{^5~cf2$nz1#%7QrwIVqTf$JuR5YXOhk38yzUpM-g~INg}qkF{E8av zMhzWdBVYQ*2B>j)a|`|H9n_=;YMO?c4MNR*zQtFl<%g(MbM(56ypfDr+jZ+3C}k^p z)3LwR0li(x1h1hsR@K%uwCj)FX^P%WFnOr`Hq>Dpdan`cSj0H)KaWM7-bbCCSmzU{ zOKsHEmvnPF-CfQ5UC{?UQIEmsFBbHn6X-b_rFz}VrapQZ^{!%8qCQR{_*bh zpuZI|=g`OQ`jaK7-{N`_Y%K?JL(Z++w~?N9msZO)vL9;!X6eRgElWE}>EW0*!V=V|t@dlDUKa z;UvcTz_{1Z_;SV~C-}LE9yF<=@wtDlN0UdODX*dL0%j-reg^v20QB!R=s(G5s`sbv zK-0cM)1B6gvO&LGLo-*PS>K@9?lZ$FWE?_sJZx?kH18$!!(%4be;~cLz!7IwGk4L# zO(;ADEph^j3mbnCm&`$tA!un^w9I0cT|~>nXoY93tZq)BRbH?D7_A9~N?4E_b;{3 zi6-cz9h_>1PS;0glFVgvwi!C-3eWr53wC_5qwxiouA|GV(UooJ>TYyxKe}!qH+rC( zZy48_SAaIkyN_;NLbvyzI}vnuJi7Nhy8pO2j2?K%!zt*|r~bEvy@Ui zlv_DFGCW`4M07ag=_+Ny584i^6rP>Fuu?dFRl|gEoeR4XBmK*0c48#lRIgTyJnE+_ R6(Tt^R3j`Y-&NIu`%{ diff --git a/test/membrane_mp4/demuxer/isom/demuxer_test.exs b/test/membrane_mp4/demuxer/isom/demuxer_test.exs index 7ae91f92..55973cd4 100644 --- a/test/membrane_mp4/demuxer/isom/demuxer_test.exs +++ b/test/membrane_mp4/demuxer/isom/demuxer_test.exs @@ -106,7 +106,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.DemuxerTest do |> child(:sink, %Membrane.File.Sink{location: out_path}) ] - pipeline = Pipeline.start_link_supervised!(structure: structure) + pipeline = Pipeline.start_link_supervised!(spec: structure) perform_test(pipeline, "video", out_path) end @@ -123,7 +123,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.DemuxerTest do |> child(:sink, %Membrane.File.Sink{location: out_path}) ] - pipeline = Pipeline.start_link_supervised!(structure: structure) + pipeline = Pipeline.start_link_supervised!(spec: structure) perform_test(pipeline, "video", out_path) end @@ -215,22 +215,19 @@ defmodule Membrane.MP4.Demuxer.ISOM.DemuxerTest do |> child(:sink, %Membrane.File.Sink{location: opts[:output_file]}) ] - Pipeline.start_link_supervised!(structure: structure) + Pipeline.start_link_supervised!(spec: structure) end defp start_remote_pipeline!(opts) do - structure = [ + spec = child(:file, %Membrane.File.Source{ location: opts[:filename], chunk_size: opts[:file_source_chunk_size] }) |> child(:demuxer, Membrane.MP4.Demuxer.ISOM) - ] - - actions = [spec: {structure, []}, playback: :playing] pipeline = RCPipeline.start_link!() - RCPipeline.exec_actions(pipeline, actions) + RCPipeline.exec_actions(pipeline, spec: spec) RCPipeline.subscribe(pipeline, %RCMessage.Notification{}) RCPipeline.subscribe(pipeline, %RCMessage.EndOfStream{}) diff --git a/test/membrane_mp4/demuxer/isom/integration_test.exs b/test/membrane_mp4/demuxer/isom/integration_test.exs index 4508e4d9..717ff175 100644 --- a/test/membrane_mp4/demuxer/isom/integration_test.exs +++ b/test/membrane_mp4/demuxer/isom/integration_test.exs @@ -52,7 +52,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:parser_video, %Membrane.H264.Parser{output_stream_structure: :annexb}) |> child(:sink, Membrane.Testing.Sink) - Pipeline.start_link_supervised!(structure: demuxing_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: demuxing_spec) |> wait_for_pipeline_termination() demuxing_buffers = flush_buffers() ref_spec = @@ -60,7 +60,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:deserializer, Membrane.Stream.Deserializer) |> child(:sink, Membrane.Testing.Sink) - Pipeline.start_link_supervised!(structure: ref_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: ref_spec) |> wait_for_pipeline_termination() ref_buffers = flush_buffers() assert demuxing_buffers == ref_buffers end @@ -85,7 +85,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: mp4_path}) ] - Pipeline.start_link_supervised!(structure: muxing_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: muxing_spec) |> wait_for_pipeline_termination() demuxing_spec = [ child(:file, %Membrane.File.Source{location: mp4_path}) @@ -95,7 +95,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path}) ] - Pipeline.start_link_supervised!(structure: demuxing_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: demuxing_spec) |> wait_for_pipeline_termination() assert_files_equal(out_path, in_path) end @@ -118,7 +118,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: mp4_path}) ] - Pipeline.start_link_supervised!(structure: muxing_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: muxing_spec) |> wait_for_pipeline_termination() demuxing_spec = [ child(:file, %Membrane.File.Source{location: mp4_path}) @@ -130,7 +130,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path}) ] - Pipeline.start_link_supervised!(structure: demuxing_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: demuxing_spec) |> wait_for_pipeline_termination() assert_files_equal(out_path, in_path) end @@ -163,7 +163,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> get_child(:muxer) ] - Pipeline.start_link_supervised!(structure: muxing_spec) |> wait_for_pipeline_termination() + Pipeline.start_link_supervised!(spec: muxing_spec) |> wait_for_pipeline_termination() demuxing_spec = [ child(:file, %Membrane.File.Source{location: mp4_path}) @@ -179,7 +179,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.IntegrationTest do |> child(:sink_audio, %Membrane.File.Sink{location: out_audio_path}) ] - Pipeline.start_link_supervised!(structure: demuxing_spec) + Pipeline.start_link_supervised!(spec: demuxing_spec) |> wait_for_pipeline_termination([:sink_audio, :sink_video]) assert_files_equal(out_video_path, in_video_path) diff --git a/test/membrane_mp4/demuxer/isom/transmuxing_test.exs b/test/membrane_mp4/demuxer/isom/transmuxing_test.exs index 9cace89e..2bbc1cef 100644 --- a/test/membrane_mp4/demuxer/isom/transmuxing_test.exs +++ b/test/membrane_mp4/demuxer/isom/transmuxing_test.exs @@ -68,6 +68,6 @@ defmodule Membrane.MP4.Demuxer.ISOM.TransmuxingTest do |> child(:sink, %Membrane.File.Sink{location: opts[:output_file]}) ] - Pipeline.start_link_supervised!(structure: structure) + Pipeline.start_link_supervised!(spec: structure) end end diff --git a/test/membrane_mp4/muxer/cmaf/integration_test.exs b/test/membrane_mp4/muxer/cmaf/integration_test.exs index 909320a9..8eefb06a 100644 --- a/test/membrane_mp4/muxer/cmaf/integration_test.exs +++ b/test/membrane_mp4/muxer/cmaf/integration_test.exs @@ -59,7 +59,7 @@ defmodule Membrane.MP4.Muxer.CMAF.IntegrationTest do get_child(:video_parser) |> get_child(:cmaf) ] - pipeline = Testing.Pipeline.start_link_supervised!(structure: structure) + pipeline = Testing.Pipeline.start_link_supervised!(spec: structure) assert_sink_stream_format(pipeline, :sink, %Membrane.CMAF.Track{ header: header, @@ -204,8 +204,7 @@ defmodule Membrane.MP4.Muxer.CMAF.IntegrationTest do |> get_child(:cmaf) ] - pipeline = Testing.Pipeline.start_link_supervised!(structure: structure) - assert_pipeline_play(pipeline) + pipeline = Testing.Pipeline.start_link_supervised!(spec: structure) assert_receive {:buffer_limiter, :audio, audio_limiter} assert_receive {:buffer_limiter, :video, video_limiter} @@ -360,8 +359,7 @@ defmodule Membrane.MP4.Muxer.CMAF.IntegrationTest do |> child(:sink, Membrane.Testing.Sink) ] - pipeline = Testing.Pipeline.start_link_supervised!(structure: structure) - assert_pipeline_play(pipeline) + pipeline = Testing.Pipeline.start_link_supervised!(spec: structure) assert_sink_stream_format(pipeline, :sink, %Membrane.CMAF.Track{ header: header, diff --git a/test/membrane_mp4/muxer/isom/integration_test.exs b/test/membrane_mp4/muxer/isom/integration_test.exs index 2cc0164d..f8477a40 100644 --- a/test/membrane_mp4/muxer/isom/integration_test.exs +++ b/test/membrane_mp4/muxer/isom/integration_test.exs @@ -57,28 +57,36 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path_for("video")}) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "video") end - test "single H265 track" do - prepare_test("video_hevc") + # This test is commented because membrane_h265_plugin is not + # mantained by Membrane Team and the latest version of it + # depends on membrane_core v0.12, while membran_mp4_plugin + # depends on membrane_core v1.0. This test should be uncommented + # after the release of a new version of membrane_h265_plugin, + # containing an upgrade of a dependency to membrane_core to at + # least "~> 1.0". - structure = [ - child(:file, %Membrane.File.Source{location: "test/fixtures/in_video_hevc.h265"}) - |> child(:parser, %Membrane.H265.Parser{ - generate_best_effort_timestamps: %{framerate: {30, 1}}, - output_stream_structure: :hvc1 - }) - |> child(:muxer, %Membrane.MP4.Muxer.ISOM{chunk_duration: Time.seconds(1)}) - |> child(:sink, %Membrane.File.Sink{location: out_path_for("video_hevc")}) - ] + # test "single H265 track" do + # prepare_test("video_hevc") - pid = Pipeline.start_link_supervised!(structure: structure) + # structure = [ + # child(:file, %Membrane.File.Source{location: "test/fixtures/in_video_hevc.h265"}) + # |> child(:parser, %Membrane.H265.Parser{ + # generate_best_effort_timestamps: %{framerate: {30, 1}}, + # output_stream_structure: :hvc1 + # }) + # |> child(:muxer, %Membrane.MP4.Muxer.ISOM{chunk_duration: Time.seconds(1)}) + # |> child(:sink, %Membrane.File.Sink{location: out_path_for("video_hevc")}) + # ] - perform_test(pid, "video_hevc") - end + # pid = Pipeline.start_link_supervised!(spec: structure) + + # perform_test(pid, "video_hevc") + # end test "single AAC track" do prepare_test("aac") @@ -90,7 +98,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path_for("aac")}) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "aac") end @@ -105,7 +113,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path_for("opus")}) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "opus") end @@ -114,12 +122,18 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do prepare_test("two_tracks") structure = [ - child(:video_file, %Membrane.File.Source{location: "test/fixtures/in_video.h264"}) + child(:video_file, %Membrane.File.Source{ + location: "test/fixtures/in_video.h264", + chunk_size: 2_000_048 + }) |> child(:video_parser, %Membrane.H264.Parser{ generate_best_effort_timestamps: %{framerate: {30, 1}}, output_stream_structure: :avc1 }), - child(:audio_file, %Membrane.File.Source{location: "test/fixtures/in_audio.aac"}) + child(:audio_file, %Membrane.File.Source{ + location: "test/fixtures/in_audio.aac", + chunk_size: 2_000_048 + }) |> child(:audio_parser, %Membrane.AAC.Parser{ out_encapsulation: :none, output_config: :esds @@ -130,7 +144,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do get_child(:audio_parser) |> get_child(:muxer) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "two_tracks") end @@ -153,7 +167,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path_for("video_fast_start")}) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "video_fast_start") end @@ -171,7 +185,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do |> child(:sink, %Membrane.File.Sink{location: out_path_for("aac_fast_start")}) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "aac_fast_start") end @@ -196,7 +210,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do get_child(:audio_parser) |> get_child(:muxer) ] - pid = Pipeline.start_link_supervised!(structure: structure) + pid = Pipeline.start_link_supervised!(spec: structure) perform_test(pid, "two_tracks_fast_start") end @@ -217,7 +231,7 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do |> child(:sink, Membrane.Fake.Sink.Buffers) ] - {:ok, _supervisor_pid, pid} = Pipeline.start(structure: structure) + {:ok, _supervisor_pid, pid} = Pipeline.start(spec: structure) monitor_ref = Process.monitor(pid) assert_receive {:DOWN, ^monitor_ref, :process, ^pid, diff --git a/test/support/buffer_limiter.ex b/test/support/buffer_limiter.ex index c394beb0..093aff5e 100644 --- a/test/support/buffer_limiter.ex +++ b/test/support/buffer_limiter.ex @@ -1,6 +1,6 @@ defmodule Membrane.MP4.BufferLimiter do @moduledoc """ - Filter responsible for collecting buffers as long as there is no pending + Filter responsible for collecting buffers as long as there is no pending release request. """ use Membrane.Filter @@ -8,7 +8,7 @@ defmodule Membrane.MP4.BufferLimiter do def_options parent: [ spec: pid(), description: """ - Parent process that is responsible for + Parent process that is responsible for unblocking buffers. """ ], @@ -20,12 +20,13 @@ defmodule Membrane.MP4.BufferLimiter do ] def_input_pad :input, - availability: :always, + flow_control: :manual, demand_unit: :buffers, accepted_format: _any def_output_pad :output, - accepted_format: _any + accepted_format: _any, + flow_control: :manual @spec release_buffers(pid(), pos_integer()) :: reference() def release_buffers(limiter, n) do @@ -58,7 +59,7 @@ defmodule Membrane.MP4.BufferLimiter do end @impl true - def handle_process(:input, buffer, _ctx, state) do + def handle_buffer(:input, buffer, _ctx, state) do queue = Qex.push(state.queue, buffer) state = %{state | queue: queue} diff --git a/test/support/mp4/muxer/cmaf/request_media_finalize_sender.ex b/test/support/mp4/muxer/cmaf/request_media_finalize_sender.ex index eee70a6a..b07c125a 100644 --- a/test/support/mp4/muxer/cmaf/request_media_finalize_sender.ex +++ b/test/support/mp4/muxer/cmaf/request_media_finalize_sender.ex @@ -8,20 +8,16 @@ defmodule Membrane.MP4.Muxer.CMAF.RequestMediaFinalizeSender do def_options parent: [ spec: pid(), description: """ - Parent process that is responsible for + Parent process that is responsible for triggering request send. """ ] def_input_pad :input, availability: :always, - demand_unit: :buffers, - demand_mode: :auto, accepted_format: _any def_output_pad :output, - availability: :always, - demand_mode: :auto, accepted_format: _any @spec send_request(pid()) :: :ok @@ -39,7 +35,7 @@ defmodule Membrane.MP4.Muxer.CMAF.RequestMediaFinalizeSender do end @impl true - def handle_process(:input, buffer, _ctx, state) do + def handle_buffer(:input, buffer, _ctx, state) do {[buffer: {:output, buffer}], state} end