diff --git a/CHANGELOG.md b/CHANGELOG.md index e12c6bf..355653a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +* Use max part target duration of all renditions to calculate part hold back. +* Add ci GitHub action + ## v0.5.0 - 2025-12-24 * Add server control option to writer. diff --git a/lib/hlx/muxer/cmaf.ex b/lib/hlx/muxer/cmaf.ex index 83ea1f3..5b4fc61 100644 --- a/lib/hlx/muxer/cmaf.ex +++ b/lib/hlx/muxer/cmaf.ex @@ -77,13 +77,13 @@ defmodule HLX.Muxer.CMAF do part_duration_s = traf_dur / state.tracks[track_id].timescale parts_duration = Map.update!(parts_duration, track_id, &(&1 + traf_dur)) - moof = %Box.Moof{moof | traf: [traf | moof.traf]} - mdat = %Box.Mdat{mdat | content: [Enum.map(samples, & &1.payload) | mdat.content]} + moof = %{moof | traf: [traf | moof.traf]} + mdat = %{mdat | content: [Enum.map(samples, & &1.payload) | mdat.content]} {moof, mdat, parts_duration, max(part_duration, part_duration_s)} end) - moof = %Box.Moof{moof | traf: Enum.reverse(moof.traf)} - mdat = %Box.Mdat{mdat | content: Enum.reverse(mdat.content)} + moof = %{moof | traf: Enum.reverse(moof.traf)} + mdat = %{mdat | content: Enum.reverse(mdat.content)} moof = Box.Moof.update_base_offsets(moof, Box.size(moof) + @mdat_header_size, true) @@ -175,14 +175,14 @@ defmodule HLX.Muxer.CMAF do traf = Box.Traf.finalize(traf, true) data = Enum.reverse(data) - moof = %Box.Moof{moof | traf: [traf | moof.traf]} - mdat = %Box.Mdat{mdat | content: [data | mdat.content]} + moof = %{moof | traf: [traf | moof.traf]} + mdat = %{mdat | content: [data | mdat.content]} {moof, mdat} end) - moof = %Box.Moof{moof | traf: Enum.reverse(moof.traf)} - mdat = %Box.Mdat{mdat | content: Enum.reverse(mdat.content)} + moof = %{moof | traf: Enum.reverse(moof.traf)} + mdat = %{mdat | content: Enum.reverse(mdat.content)} {moof, mdat} end @@ -190,7 +190,7 @@ defmodule HLX.Muxer.CMAF do defp finalize_segments(segments, moof, mdat) do {segments, _size} = Enum.map_reduce(moof.traf, 0, fn traf, acc -> - segment = segments[traf.tfhd.track_id] + %Box.Sidx{} = segment = segments[traf.tfhd.track_id] segment = %Box.Sidx{ segment diff --git a/mix.exs b/mix.exs index 9849ef9..b6f7ed6 100644 --- a/mix.exs +++ b/mix.exs @@ -33,7 +33,7 @@ defmodule HLX.MixProject do [ {:media_codecs, "~> 0.10.0"}, {:ex_mp4, "~> 0.14.0"}, - {:ex_m3u8, "~> 0.15.0"}, + {:ex_m3u8, "~> 0.16.0"}, {:mpeg_ts, "~> 3.3.5"}, {:qex, "~> 0.5.1"}, {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, diff --git a/mix.lock b/mix.lock index 558c70d..85bbc01 100644 --- a/mix.lock +++ b/mix.lock @@ -5,7 +5,7 @@ "credo": {:hex, :credo, "1.7.15", "283da72eeb2fd3ccf7248f4941a0527efb97afa224bcdef30b4b580bc8258e1c", [: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", "291e8645ea3fea7481829f1e1eb0881b8395db212821338e577a90bf225c5607"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, "ex_doc": {:hex, :ex_doc, "0.39.3", "519c6bc7e84a2918b737aec7ef48b96aa4698342927d080437f61395d361dcee", [:mix], [{:earmark_parser, "~> 1.4.44", [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", "0590955cf7ad3b625780ee1c1ea627c28a78948c6c0a9b0322bd976a079996e1"}, - "ex_m3u8": {:hex, :ex_m3u8, "0.15.4", "66f6ec7e4fb7372c48032db1c2d4a3e6c2bbbde2d1d9a1098986e3caa0ab7a55", [:mix], [{:nimble_parsec, "~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "ec03aa516919e0c8ec202da55f609b763bd7960195a3388900090fcad270c873"}, + "ex_m3u8": {:hex, :ex_m3u8, "0.16.0", "29fc405a790d95bb320cbbbbaa1d6c2608f043bce02ad8d35e6489497ca4b2a0", [:mix], [{:nimble_parsec, "~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.3.0", [hex: :typed_struct, repo: "hexpm", optional: false]}], "hexpm", "a98a149c14b3929cfe163fd9d23edfa86ab0bc72bee5c1945e9dab058aa051d7"}, "ex_mp4": {:hex, :ex_mp4, "0.14.1", "6152b9b981d5d6d5069d8dccd3d60f4f4be135f758f9b4bae039018119fdf089", [:mix], [{:media_codecs, "~> 0.10.0", [hex: :media_codecs, repo: "hexpm", optional: true]}, {:ratio, "~> 4.0", [hex: :ratio, repo: "hexpm", optional: false]}, {:table_rex, "~> 4.0", [hex: :table_rex, repo: "hexpm", optional: true]}], "hexpm", "f9f9630406371d19691673acea83f378b96e5c1961eb28436aa5d8ded148188c"}, "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"},