From 22e7ae81145bde1d379ec0983f4d9146c5204cb7 Mon Sep 17 00:00:00 2001 From: Billal Ghilas <84322223+gBillal@users.noreply.github.com> Date: Mon, 29 Jul 2024 10:45:07 +0100 Subject: [PATCH] store ctts table (#115) * store ctts table on muxing * revert add_dts_offset option * fix typo * run mix format * upgrade deps --- lib/membrane_mp4/demuxer/isom/samples_info.ex | 2 +- .../movie_box/sample_table_box.ex | 28 +++++++++++ lib/membrane_mp4/track/sample_table.ex | 19 ++++++++ mix.lock | 44 +++++++++--------- .../fixtures/demuxed_and_depayloaded_video.ms | Bin 113005 -> 113053 bytes test/fixtures/isom/ref_two_tracks.mp4 | Bin 134252 -> 134356 bytes .../isom/ref_two_tracks_fast_start.mp4 | Bin 134252 -> 134356 bytes test/fixtures/isom/ref_video.mp4 | Bin 36333 -> 36437 bytes test/fixtures/isom/ref_video_fast_start.mp4 | Bin 36333 -> 36437 bytes test/fixtures/isom/ref_video_hevc.mp4 | Bin 25556 -> 25700 bytes .../muxer/isom/integration_test.exs | 27 +++++++++++ 11 files changed, 97 insertions(+), 23 deletions(-) diff --git a/lib/membrane_mp4/demuxer/isom/samples_info.ex b/lib/membrane_mp4/demuxer/isom/samples_info.ex index aa79122..3abcb71 100644 --- a/lib/membrane_mp4/demuxer/isom/samples_info.ex +++ b/lib/membrane_mp4/demuxer/isom/samples_info.ex @@ -106,7 +106,7 @@ defmodule Membrane.MP4.Demuxer.ISOM.SamplesInfo do {dts, pts} = case samples_info.last_dts[track_id] do nil -> - {0, 0} + {0, scalify(sample_composition_offset, timescale)} last_dts -> {last_dts + scalify(delta, timescale), diff --git a/lib/membrane_mp4/movie_box/sample_table_box.ex b/lib/membrane_mp4/movie_box/sample_table_box.ex index 66bf91e..224e7d8 100644 --- a/lib/membrane_mp4/movie_box/sample_table_box.ex +++ b/lib/membrane_mp4/movie_box/sample_table_box.ex @@ -35,6 +35,7 @@ defmodule Membrane.MP4.MovieBox.SampleTableBox do } } ] ++ + maybe_sample_composition_offsets(table) ++ maybe_sample_sync ++ [ stsc: %{ @@ -197,6 +198,33 @@ defmodule Membrane.MP4.MovieBox.SampleTableBox do %{sample_count: count, sample_delta: Helper.timescalify(delta, timescale)} end) + defp maybe_sample_composition_offsets(%{composition_offsets: []}), do: [] + + defp maybe_sample_composition_offsets(%{composition_offsets: [%{sample_composition_offset: 0}]}), + do: [] + + defp maybe_sample_composition_offsets(%{ + timescale: timescale, + composition_offsets: composition_offsets + }) do + composition_offsets + |> Enum.map(fn %{sample_count: count, sample_composition_offset: offset} -> + %{sample_count: count, sample_composition_offset: Helper.timescalify(offset, timescale)} + end) + |> then( + &[ + ctts: %{ + fields: %{ + version: 0, + flags: 0, + entry_count: length(&1), + entry_list: &1 + } + } + ] + ) + end + defp maybe_sample_sync(%{sync_samples: []}), do: [] defp maybe_sample_sync(%{sync_samples: sync_samples}) do diff --git a/lib/membrane_mp4/track/sample_table.ex b/lib/membrane_mp4/track/sample_table.ex index fa262be..271a545 100644 --- a/lib/membrane_mp4/track/sample_table.ex +++ b/lib/membrane_mp4/track/sample_table.ex @@ -63,6 +63,7 @@ defmodule Membrane.MP4.Track.SampleTable do |> maybe_store_first_dts(buffer) |> do_store_sample(buffer) |> update_decoding_deltas(buffer) + |> update_composition_offsets(buffer) |> maybe_store_sync_sample(buffer) |> store_last_dts(buffer) end @@ -100,6 +101,7 @@ defmodule Membrane.MP4.Track.SampleTable do :sync_samples, :chunk_offsets, :decoding_deltas, + :composition_offsets, :samples_per_chunk ] @@ -148,6 +150,23 @@ defmodule Membrane.MP4.Track.SampleTable do end) end + defp update_composition_offsets(sample_table, %Buffer{dts: dts, pts: pts}) do + Map.update!(sample_table, :composition_offsets, fn previous_offsets -> + new_offset = pts - dts + + case previous_offsets do + [] -> + [%{sample_count: 1, sample_composition_offset: new_offset}] + + [%{sample_count: count, sample_composition_offset: ^new_offset} | rest] -> + [%{sample_count: count + 1, sample_composition_offset: new_offset} | rest] + + _different_delta_or_empty -> + [%{sample_count: 1, sample_composition_offset: new_offset} | previous_offsets] + end + end) + end + defp maybe_store_sync_sample(sample_table, %Buffer{metadata: %{h264: h264}}) when h264.key_frame? do Map.update!(sample_table, :sync_samples, &[sample_table.sample_count | &1]) diff --git a/mix.lock b/mix.lock index 9d2cd94..a24c61b 100644 --- a/mix.lock +++ b/mix.lock @@ -2,54 +2,54 @@ "bimap": {:hex, :bimap, "1.3.0", "3ea4832e58dc83a9b5b407c6731e7bae87458aa618e6d11d8e12114a17afa4b3", [:mix], [], "hexpm", "bf5a2b078528465aa705f405a5c638becd63e41d280ada41e0f77e6d255a10b4"}, "bunch": {:hex, :bunch, "1.6.1", "5393d827a64d5f846092703441ea50e65bc09f37fd8e320878f13e63d410aec7", [:mix], [], "hexpm", "286cc3add551628b30605efbe2fca4e38cc1bea89bcd0a1a7226920b3364fe4a"}, "bunch_native": {:hex, :bunch_native, "0.5.0", "8ac1536789a597599c10b652e0b526d8833348c19e4739a0759a2bedfd924e63", [:mix], [{:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "24190c760e32b23b36edeb2dc4852515c7c5b3b8675b1a864e0715bdd1c8f80d"}, - "bundlex": {:hex, :bundlex, "1.4.6", "6d93c4ca3bfb2282445e1e76ea263cedae49ba8524bf4cce94eb8124421c81fc", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, "~> 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "549115f64f55e29b32f566ae054caa5557b334aceab279e0b820055ad0bfc8b6"}, + "bundlex": {:hex, :bundlex, "1.5.3", "35d01e5bc0679510dd9a327936ffb518f63f47175c26a35e708cc29eaec0890b", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:elixir_uuid, "~> 1.2", [hex: :elixir_uuid, repo: "hexpm", optional: false]}, {:qex, "~> 0.5", [hex: :qex, repo: "hexpm", optional: false]}, {:req, ">= 0.4.0", [hex: :req, repo: "hexpm", optional: false]}, {:zarex, "~> 1.0", [hex: :zarex, repo: "hexpm", optional: false]}], "hexpm", "debd0eac151b404f6216fc60222761dff049bf26f7d24d066c365317650cd118"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "castore": {:hex, :castore, "1.0.5", "9eeebb394cc9a0f3ae56b813459f990abb0a3dedee1be6b27fdb50301930502f", [:mix], [], "hexpm", "8d7c597c3e4a64c395980882d4bca3cebb8d74197c590dc272cfd3b6a6310578"}, + "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, "coerce": {:hex, :coerce, "1.0.1", "211c27386315dc2894ac11bc1f413a0e38505d808153367bd5c6e75a4003d096", [:mix], [], "hexpm", "b44a691700f7a1a15b4b7e2ff1fa30bebd669929ac8aa43cffe9e2f8bf051cf1"}, "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"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"}, "elixir_uuid": {:hex, :elixir_uuid, "1.2.1", "dce506597acb7e6b0daeaff52ff6a9043f5919a4c3315abb4143f0b00378c097", [:mix], [], "hexpm", "f7eba2ea6c3555cea09706492716b0d87397b88946e6380898c2889d68585752"}, - "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, - "ex_doc": {:hex, :ex_doc, "0.31.1", "8a2355ac42b1cc7b2379da9e40243f2670143721dd50748bf6c3b1184dae2089", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.1", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "3178c3a407c557d8343479e1ff117a96fd31bafe52a039079593fb0524ef61b0"}, + "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, + "ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"}, "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [: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", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"}, "heap": {:hex, :heap, "2.0.2", "d98cb178286cfeb5edbcf17785e2d20af73ca57b5a2cf4af584118afbcf917eb", [:mix], [], "hexpm", "ba9ea2fe99eb4bcbd9a8a28eaf71cbcac449ca1d8e71731596aace9028c9d429"}, - "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, + "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, "jason": {:hex, :jason, "1.4.3", "d3f984eeb96fe53b85d20e0b049f03e57d075b5acda3ac8d465c969a2536c17b", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "9a90e868927f7c777689baa16d86f4d0e086d968db5c05d917ccff6d443e58a3"}, "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.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.4", "29563475afa9b8a2add1b7a9c8fb68d06ca7737648f28398e04461f008b69521", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f4ed47ecda66de70dd817698a703f8816daa91272e7e45812469498614ae8b29"}, + "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, "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.0", "573bfff6acf2371c5046b9174569f6316f4205e3d6e13e814bf7e613e5653a54", [:mix], [], "hexpm", "4ac6a24a33f61347a2714c982a5f84aa6207641f4de2ad5afde68a8b800da8de"}, + "membrane_cmaf_format": {:hex, :membrane_cmaf_format, "0.7.1", "9ea858faefdcb181cdfa8001be827c35c5f854e9809ad57d7062cff1f0f703fd", [:mix], [], "hexpm", "3c7b4ed2a986e27f6f336d2f19e9442cb31d93b3142fc024c019572faca54a73"}, "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.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_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.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_file_plugin": {:hex, :membrane_file_plugin, "0.17.2", "650e134c2345d946f930082fac8bac9f5aba785a7817d38a9a9da41ffc56fa92", [:mix], [{:logger_backends, "~> 1.0", [hex: :logger_backends, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "df50c6040004cd7b901cf057bd7e99c875bbbd6ae574efc93b2c753c96f43b9d"}, "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.0", "0a7c6b9a7678e8c111b22b5417465ac31cf6e598cff6a53ab53a9c379bdfa1ef", [: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", "e9cde8c8995ace9fc26355037cbcc780f1727a3f63d36c21b52232fd29d0ad40"}, + "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_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.19.3", "af398a10c84d27e49b9a68ec78a54f123f2637441dd380857a3da4bb492eca5c", [: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_precompiled_dependency_provider, "~> 0.1.0", [hex: :membrane_precompiled_dependency_provider, 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", "172d5637233e4e7cb2c464be34ea85b487188887381ef5ff98d5c110fdf44f5b"}, - "membrane_precompiled_dependency_provider": {:hex, :membrane_precompiled_dependency_provider, "0.1.1", "a0d5b7942f8be452c30744207f78284f6a0e0c84c968aba7d76e206fbf75bc5d", [:mix], [{:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "87ad44752e2cf0fa3b31c5aac15b863343c2f6e0f0fd201f5ec4c0bcda8c6fa3"}, + "membrane_precompiled_dependency_provider": {:hex, :membrane_precompiled_dependency_provider, "0.1.2", "8af73b7dc15ba55c9f5fbfc0453d4a8edfb007ade54b56c37d626be0d1189aba", [:mix], [{:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "7fe3e07361510445a29bee95336adde667c4162b76b7f4c8af3aeb3415292023"}, "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"}, "membrane_timestamp_queue": {:hex, :membrane_timestamp_queue, "0.2.2", "1c831b2273d018a6548654aa9f7fa7c4b683f71d96ffe164934ef55f9d11f693", [:mix], [{:heap, "~> 2.0", [hex: :heap, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "7c830e760baaced0988421671cd2c83c7cda8d1bd2b61fd05332711675d1204f"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, - "mint": {:hex, :mint, "1.5.2", "4805e059f96028948870d23d7783613b7e6b0e2fb4e98d720383852a760067fd", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "d77d9e9ce4eb35941907f1d3df38d8f750c357865353e21d335bdcdf6d892a02"}, - "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, + "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_ownership": {:hex, :nimble_ownership, "0.2.1", "3e44c72ebe8dd213db4e13aff4090aaa331d158e72ce1891d02e0ffb05a1eb2d", [:mix], [], "hexpm", "bf38d2ef4fb990521a4ecf112843063c1f58a5c602484af4c7977324042badee"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, - "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"}, + "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "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.11", "cb19f87d5251e7de30cfc67d1899696b290711092207c6b2e8fc2294f237fcdc", [:mix], [{:aws_signature, "~> 0.3.2", [hex: :aws_signature, repo: "hexpm", optional: true]}, {:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [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]}, {:nimble_ownership, "~> 0.2.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bbf4f2393c649fa4146a3b8470e2a7e8c9b23e4100a16c75f5e7d1d3d33144f3"}, - "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"}, + "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"}, + "req": {:hex, :req, "0.5.2", "70b4976e5fbefe84e5a57fd3eea49d4e9aa0ac015301275490eafeaec380f97f", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [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", "0c63539ab4c2d6ced6114d2684276cef18ac185ee00674ee9af4b1febba1f986"}, + "shmex": {:hex, :shmex, "0.5.1", "81dd209093416bf6608e66882cb7e676089307448a1afd4fc906c1f7e5b94cf4", [:mix], [{:bunch_native, "~> 0.5.0", [hex: :bunch_native, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.0", [hex: :bundlex, repo: "hexpm", optional: false]}], "hexpm", "c29f8286891252f64c4e1dac40b217d960f7d58def597c4e606ff8fbe71ceb80"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, - "unifex": {:hex, :unifex, "1.1.1", "e8445ff780ea07c10657428051e4cf84359f2770e27d24e9d8636430662691ff", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}, {:shmex, "~> 0.5.0", [hex: :shmex, repo: "hexpm", optional: false]}], "hexpm", "3e2867237a5582a40cb7c88d9ed0955071ebb1c4d525345513544adc0abd3b4b"}, + "unifex": {:hex, :unifex, "1.2.0", "90d1ec5e6d788350e07e474f7bd8b0ee866d6606beb9ca4e20dbb26328712a84", [:mix], [{:bunch, "~> 1.0", [hex: :bunch, repo: "hexpm", optional: false]}, {:bundlex, "~> 1.4", [hex: :bundlex, repo: "hexpm", optional: false]}, {:shmex, "~> 0.5.0", [hex: :shmex, repo: "hexpm", optional: false]}], "hexpm", "7a8395aabc3ba6cff04bbe5b995de7f899a38eb57f189e49927d6b8b6ccb6883"}, "zarex": {:hex, :zarex, "1.0.5", "58239e3ee5d75f343262bb4df5cf466555a1c689f920e5d3651a9333972f7c7e", [:mix], [], "hexpm", "9fb72ef0567c2b2742f5119a1ba8a24a2fabb21b8d09820aefbf3e592fa9a46a"}, } diff --git a/test/fixtures/demuxed_and_depayloaded_video.ms b/test/fixtures/demuxed_and_depayloaded_video.ms index 2cfa4c7710f5fdb6fde4355bd90d79779e5f1d96..7ba1cb15f92413c24c9e23e59ecc7efd812ea9fa 100644 GIT binary patch delta 4315 zcmZWscU)B0@@Mv3c9C5byG9gH6uT0mSfbcKuu#;c2@1+mq^uwWumBQ8eTbl=o?zEV z)QyUIHLKCs%hQlxNi4+pY|q3sL6$_>jfLObyAt#Jyg$#}b7sD0<~!dr_xC#G=0B9B ztC}bibcyi^88NY|i#s?>^O-W)&Q4u`XPSB)eD15ZpVjF*ogKOw%-Ex8F>|?MkNR*6 z9%vTF+%A@*TOSKLT~MR5(`455oUfSd6alQ;sV8Xmw&L4lN33i)gL#}N6#KRc1J?7H zhq%0T2(aEqE{PA?L;>r2C|(@hE)rP(3I}mp`!oaF*teAxuer|@Mwc2IaKOLKYYJ7^r+YjbTRagTw6WkS51rt%;+X+Q7nt$a z9%*cR;Yu;GX9NiTpZ3vWzydRlDpumb-YINiUZv>PCkTYe3sdY+qpio}e)ELDoTge- z$5`;E{xgK&%zZXkgFLg@)bs%Hfag>Yw5c^(ek}paeC9+@;@g3#EHr7AsQ>6|5W*As z+o4mgndf`aCwH$zHa)gVEcJ>7Au2|1;Lb&qn5RQ$3NvRo+3^_>wAy-Gh2w_j2{91| zv@-0YAEybkLxT)|$53Inktu?1s@V=*9-8r_sKQm=(JVe_wP^N^0U>d+r$JoNS^*d~ zW-3eazb@_{lL#!uH=S~4!Nl*HqKi)?(~oT_=K9cwH19*A$#)8{c^^;3QZEa7`6mmR zL;iRlQHfh7q_V6*C^nxM1wzh;A8GMHg&AWeFA)~>`@w*L4Q8xbuEhHRbA?5{GaB%; z)r>wti-f!$ZL~bUBi*Zcni9VWPFJN0c7`MFi{Bf2PfbVP#Af)_7!%^O3~7V*Wv8X@ zH?R=fsr4T$dv8n&O>a&+8wR&qVdFSR9Dj;;!q&(hZnY|s2!R7?lo%hOlfz~?6=Ow| z8P877m(~sKnwFs3b%_Eh^o~lB{ArIiS^dsmy6kV;i~`AS2vg!a`#ss-KDtKsVNtA; zt8o9V3fZhEId)mYdVau>2r*Znsz=U_m7@=R{TZIwZARB>C7y_lkx$>TY{1oCW-Q&I zLGiJvpvJdLE$hDVt;ZF&A_I1rR`EDcU=-KpVJMf^VnU{P) zr*|h!XRm(QNxZgDx2CX-kH5gVC+ks{8qYp{uv@H3odoRe&jz_X&C_z(!s@+ZY1%|! zoo?;7<#w)b3%oxs2`8*@X7UM8t^uP;t!aOk`^x?nc2?fWmv7umWb1tT`R+cS?n+;xS_^_a3Ol@;u) zse3rtL3m?C)*RwJ``y%@Z?!RTmfQ`j$eCDt3KmNE$k5>*k@^K}E zVaS#|>~+`?LmEu@<<=~9kEELa$HcbV3vq(ck>5_B&80gsSwd``oQa0dQ(2RkKgGE_ z=L6dl_0pyz_r6%B_K&c&&+I0N{@2vkqN^bfSg)YB{EZ)FaoboW zmhGLVw70YSc9I>YRo2OrYqCFCWpAfV@+U=+$eLWCZ*FgAQ2Pq-Pk=mdIsFv;5iaBjFHS&5Q|--bIjdN?WL>wM&UDR}V^4F=z=!$)7m z(o)-ZP%~UzU1!tKaYvKLX86w2iNE%PI>M~NeaF(Jn5q3*0#=MMW832ySaH>Yi%-mx z!tD2G+ZaYKhk5o*o)jj~y*;mRBp;SwfwCFB{bQZ?mxDL$#PwITP524Sn&!V=MmfeImQ@s=qj@DxE~x;>lOH z2P^Ksrf02Q45YGHvBQm2;jnoS@Ga#~j|D$Ov1v74Jg_slul_NE{b?F12Hy+^w(ghV z;=WtCzy>`YVZ+kBIsyNBt`^IxX8`-;=h5WOf^~QGtZnsJDWg`5x|gZ>>ZVU)%Btm* zUHZ@OLgClpT7X6Eq0sSXOPADHYXJX(aQuOa&x@QSNWN`U!TJhn^Ks|Z77V^8qYSZPZCdA z^}t48is<=j8t}3fv*tK$)^>3CUtFs~aAdg0{KOk1h= zL4YXk)(&2CM+Rv^Lv9X8kG$k1jaxgA&sJKKG?VbV_ApQI&R!&^fsa#xPPm_u*O&(t zcO49lyutxuH2GVkdDU)g}R$;9q8Z-2w7ReSJ0>^EyHbFrP7-jg&4L z8vi?TtC6Ui4BUMXg)+KQ(4xWb)2rg0yTBZF@uPB?pnOSJ$Q0r{cfHTW3wJv5(=fVD zy)#{BdUw#VUA?}Pc*ak75XA8w`{X9#ZaqQIJ9taZt6uT-y=av)iq6H;JI0|8ga|!4 zi9oVy=9BuuJk8|}M;dc0YX?8v4+@0DwnmWNa^8CY0c+CgnA}^u)Dsezq4{wfRb}CS zdSX z7!9dHvFU0f*H!%97|7;N!{~cfxCvcaD|zrZh~p6vWTAzqoZ{C#@$jaj;68PHd_duEv`S+7x3HP6EgKOpi0g%P_ z#M07ON+~}R2#eXZe?OL4IU*P$S=xms#!bPnoW%6(uX2O(4$~k(bLgb0u@d<*%RkWq zvMI-ZvlZ4p6!fglSVN-8fX@%36&|iN{uU-d8+fqJ7!?88zH}m+K&&R~Jy>+r>$}a&wKqJvURnk`iE+@JWeMVWhtW9SH4KIw*MQc&O)|NsulW zmpdxn5kSSaCPTU=bg4#RdtsaOB|u)QpF80bb1 z2+56X2or`ZXsM8ALf82a!-tkot_6R}^`ZsTH#r$?71D5O;WZ1X&OO)A*Ylj3CNP(d zex34xf_}-&d{Z982@!Lg<-PU%O+Lg6f5mlHNbe#KFM!4T7^h6~G!w7-6vBn!(One0 z)|u|obtx&;Pm%5ln!zmeXgTs#g=AS6-d!OLKJ~n28Ij02q=#|latH)ow1qNtYz5H! z7ZupYNY@Ak;myQ;3VEEQzXl#(3^~GPzX1yDaNff2t|A5X*hxY$sFbL*pbbobno`kh|8j4(9NVUlRUyZYI8}C8&51r^d1K z9BDkkAqe>8ee|(W-MMN5BnhK>jj^4M-$*_Gp!+zfs8;^nCWv8+yZRbwMZcA9u72;X zS-6#2?X2^JMi5H=d>bYF_!06P(oidn`*Q_F+W>_;Qw^w5@e`jz68pSm5dXM@9Cs}z zij8eP#kjc~v>-fEPqT&pWf#m5mNg2nJDC}+@W~|sl0xFz`2wUl$_7W`J+v%K6 zTX^z5h!X5yMK#7!^7H#4SyNs=^BupyPbPe~12A3V`)5p})nBsWX}yv!I0zw{C$+Qx z_eYRXJ6N+l#7glsr;SC5xk zVdXVncCuM4%Y$vv^04}OXP3>Qv1n%5?YZA?jeh&*_k7R2=bX>^oX@>?>mTxGFXih# zAK+xr%*~9}8KU*^8JajvhQ>RKW~67vXUP-ebqR^wHp6fF6dN059+r(AQTbwmQl_y% z-wG3cY`>PmyHYh4=}j2(T!Ba0#S>!j5xP4B0kM63Ur2Eb2da3PuSU^>+|HTYl~n`VGv4%P;}z!dj+D$l)NsauTGIqJWmW0L~! z435HtZtu{`Gn)=8|IG$#lT7IIP=Wh~gwqjatJDm19KE6do*WD{s77wDC8^Oj-h|7&(y8}Gy9yS#hA02~$Y|obZm%$PR5sA@YXj8H zHC2yEqkgNNR=f|Tz{Pu-C@U3bFz>NAR7l0b6Z+NJA3_|760F85#E4grN2B*YKV-p#97= zd#!GY=lf-nbF6lIo-99w%VK_ zLtD8j$E?^mTWzlUwF*piY{Z*!8e8q6k26}QVdR`dTWwyyj%xnjgo`>VurxtSj`qoy zS}zUEUx@~y{&1N%5`02a$QzgCLTyqAkm9Z@c?D)Z?0Pc%gH=M2J_^VU=QTouArMHG z<5~%QkF>?)1N$POGA#f|RonIKP&eMOhItD~s2p*LmJ3FvftY2RgxX9kkj+iSOkc!3 zQV+{bvBwGlwP&sE{AwPqZ$E|%Oq{f%|K0@tn2AbBT`x8SY7rVWY2_4o;^ zgB&#*Gs&r{Ql}yrvcI=xsTqSJ@>g>6-0X$}?N9v;dnfQEx=q3KCoLleAhA+Nv)Ngs^K8 z4zA?}QjXV!_2mnIe75dqoHojYO}kc-M}>7**ujK%Cn_-it0=O3)h({}W~|#2M?P9{ zNARu419EohJu5Nf_|3j~xSQFtHae)6C^+yyvYgte&T%uM#6yB*wjLPVdUG9MQY2=9Pq!Z*_*~y(jXGBpdsW&lA1<~# zoiN~R2vJU;LfKgjsP>JM!#^nB_@8(Z=-q~yI)WKzT}Y(AkG2C51~XP)%%W?(RDh|4 zCft8qf$lY_WYDm7LRn1$kRLrA(dicp(#twxaBnZ9UQP$Bs(vlC_fBmJIpEd_%W5p> zf7O5`CzR~JJD~v&UyCF!T)VQo9z1~E^$b$v(p|{E9tOmtYY*Y}4bHMFom`u6qV8MwGW9X2kLDFAL4OiffN6F;s+rfg}d<2m$PTlc?F;2(cz$k*5X zuYLw< zFqeLc`sS)wv=bze+eIn7nKE8Ldx*hqe=Ch6ogo-7w@Hb6&Ni^+9YIGk~O+P6nPLfHO1CfiRPvnYIbI z@|dvbpqwoo1bS6mAhQCTg7-JRVD;{>koE7%H&GYYvj`6kRk`24rDQ}o?~#h+!$XRGV9&+e~E=NInOk8nMu%(}IYUw%|-|G{5=m)8!t@ANy{nUwIAQcYP z%vZ+wy~az)PEUdaGFkPlRXbRp$uOVPw>c@Qk%bipz&utxoOifGAQJXCXARR}DN~N-K#H`~2g7WlGM_ir1VaJPeXlM`v&sBtKqB+^=Fmtt zJGM&=$oBYvl5vWe*sxg~!?pESxO5U=6`}mg{qavN*(q4ZaLA;W9$o|SJQNSA71VI= zdTad<3Gu|?_RmILB;@cG`13f&q&d0~4K=J}GS6<$Srgl?;aRi|8H);F z8jxAbRmS_PfS-xx{C38GHC$=P7mFQ@+Y2ELs8?=#nRJV3=cr(+B8Vh6vpN{(7C|b| zoQzJg_nf-19+uKBX`RKOjcf)&D*Z;^Ro23HIXk(L*BYMGT_(MF`GuQ(SPZfB&pAD0 z(i4@xfmt4dBxbja!}^NBBp{<>dKtYpLoCq$o83oR$k@O6)GrL{%QRa#Mt^PL_;#P! z&&a>RfgGPcK&tTT?R@wmrwz15S1{Ky4#{5u?#$6?>*t4);EV?Hmlyo$7Z|9`qf|TE2U)G|k~Q=g_|owX(`EkykvKNF diff --git a/test/fixtures/isom/ref_two_tracks.mp4 b/test/fixtures/isom/ref_two_tracks.mp4 index 0bcd39c117368a877970964457b6076e61f8addd..d716cc85b2ff9a71df5b69529d47d60b61ed4796 100644 GIT binary patch delta 188 zcmaDegX79fj)pCaE8j3F=uTh#hOwA&=JbGHjMCGs-ZHu~@tRI=e#;ob_+a{tw~Y3T z3${zVV|>q6pOIWrQp^AW+(3$vfx!mEV}jBY@)>2J=13Hm6vONRnhmmt;Wq=rcDb*N Ge&PV$At6ry delta 60 zcmV-C0K@;(nF#Ed2!ON!sq6wD#h0t>0doN{mmlo`Vgd}!mmK>68ke2z0XhMAm)PwA SKLI$m814b@2DfkZ0c95(hZ!XR diff --git a/test/fixtures/isom/ref_two_tracks_fast_start.mp4 b/test/fixtures/isom/ref_two_tracks_fast_start.mp4 index 1f81247fc5568c11277af00d5dbf0275a0fafdfa..df2e6cf5423525b4a3f1e421a236ab0883749d59 100644 GIT binary patch delta 244 zcmaDegX79fjtNRk3c3?jiWz54KFKRRakD!Uujyo6KB>uKj8=>fCI>RwGcMRXk?}oS zN=9-?NihQia04ku1_m1tj|oas$Y+!VnzOlvLzz`gA(Vk3GL?a$N05PGZvz9v>tzg# z(vKJzy`>o#E7KVmm)kNh-aEYcDDQ7U)p`bo)P4qrY3CRiP9`xhd>3J0R4Za&4AW*{ ZZ1rPc+&Phf@%i%Rr}EpM$}_gV0RZ7IF-!me delta 138 zcmV;50CoS=nF#Ed2#_KIAH|U*a{)1vF%BD%vqu69&5`_60eF*90Y3pavylPs2D9i0 z9|a~K?EnB+{Qv-qsQ>`I7ytn4J^%q5dH?}Rvj72j{{R7|)c^tBTeB?=`w=A<003nt s005R|007AP008!^00AZn00C9Q00D&N00Frv00HMegH0f}O&|e>>|IPN;{X5v diff --git a/test/fixtures/isom/ref_video.mp4 b/test/fixtures/isom/ref_video.mp4 index c35d887bc2ee93c36e7e121e7598f240fcf5469e..a07bd0ef67b6c94f2adecfd0a814d887ee3da0db 100644 GIT binary patch delta 175 zcmaDmo9XHtrVU;VOnkhPeHw}xXHGuQki^7mI$5PLgz>@T%0_#}1)Fy^zGth?NG>TU sW`F>0AjQbQU<2YYL1_y4jIvO3B#KLlVfFyc2HC^#n}K2T{ti7>0Ks1yw*UYD delta 47 zcmV+~0MP%{oC58e0w=eWnfT_XJF9pWMHszV_V!*_W%GdApih5-T(kazyJVIE&u>qz5oDb&Hw;%wEzHx39~H@D1ZiT8h8Kz diff --git a/test/fixtures/isom/ref_video_hevc.mp4 b/test/fixtures/isom/ref_video_hevc.mp4 index 7f3e0e299b585115c1284e7f6fc83745af697301..edd6736aea1626d60daa41226c54b900d155a6e8 100644 GIT binary patch delta 191 zcmca|obkyC#tm;nnfNLvzYi^9;$xkh9G1+uaPsl6U?yIl$ui+~OuRgsW5SKu>n9|a yloT^SfB=wUWMHrX@tB}Ag?vUnggFi%bAjerfM{-rI4?-R0VDvD*xViG$qE2ouo#j6 delta 49 zcmV-10M7s9$N|*H0kG{=0uAYt?^SXF4Rw=aR$~DXlgCz50t~#999KR941BX(S2G8* HA74cU56=>K diff --git a/test/membrane_mp4/muxer/isom/integration_test.exs b/test/membrane_mp4/muxer/isom/integration_test.exs index 1766822..f3f74a8 100644 --- a/test/membrane_mp4/muxer/isom/integration_test.exs +++ b/test/membrane_mp4/muxer/isom/integration_test.exs @@ -237,4 +237,31 @@ defmodule Membrane.MP4.Muxer.ISOM.IntegrationTest do 1_000 end end + + describe "ctts table" do + test "should not be stored when dts and pts values are equal" do + prepare_test("video") + + structure = [ + child(:file, %Membrane.File.Source{location: "test/fixtures/in_video.h264"}) + |> child(:parser, %Membrane.H264.Parser{ + generate_best_effort_timestamps: %{framerate: {30, 1}, add_dts_offset: false}, + output_stream_structure: :avc1 + }) + |> child(:muxer, %Membrane.MP4.Muxer.ISOM{chunk_duration: Time.seconds(1)}) + |> child(:sink, %Membrane.File.Sink{location: out_path_for("video")}) + ] + + pid = Pipeline.start_link_supervised!(spec: structure) + + assert_end_of_stream(pid, :sink, :input) + refute_sink_buffer(pid, :sink, _buffer, 0) + + assert :ok == Pipeline.terminate(pid) + + assert {parsed_out, <<>>} = out_path_for("video") |> File.read!() |> Container.parse!() + assert Container.get_box(parsed_out, [:moov, :trak, :mdia, :minf, :stbl, :stts]) + refute Container.get_box(parsed_out, [:moov, :trak, :mdia, :minf, :stbl, :ctts]) + end + end end