diff --git a/README.md b/README.md index 956abf23..a13d02d3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The package can be installed by adding `membrane_rtmp_plugin` to your list of de ```elixir def deps do [ - {:membrane_rtmp_plugin, "~> 0.23.3"} + {:membrane_rtmp_plugin, "~> 0.23.4"} ] end ``` diff --git a/lib/membrane_rtmp_plugin/rtmp/sink/sink.ex b/lib/membrane_rtmp_plugin/rtmp/sink/sink.ex index cb9014c6..1e947c57 100644 --- a/lib/membrane_rtmp_plugin/rtmp/sink/sink.ex +++ b/lib/membrane_rtmp_plugin/rtmp/sink/sink.ex @@ -52,6 +52,14 @@ defmodule Membrane.RTMP.Sink do description: """ A list of tracks, which will be sent. Can be `:audio`, `:video` or both. """ + ], + reset_timestamps: [ + spec: boolean(), + default: true, + description: """ + If enabled, this feature adjusts the timing of outgoing FLV packets so that they begin from zero. + Leaves it untouched otherwise. + """ ] @impl true @@ -89,7 +97,8 @@ defmodule Membrane.RTMP.Sink do # remaining pad are simply forwarded to the output. # Always on if a single track is connected forward_mode?: single_track?, - video_base_dts: nil + video_base_dts: nil, + reset_timestampts: options.reset_timestamps }) {[], state} @@ -303,15 +312,13 @@ defmodule Membrane.RTMP.Sink do end defp write_frame(state, Pad.ref(:video, 0), buffer) do - dts = buffer.dts || buffer.pts - pts = buffer.pts || buffer.dts - {base_dts, state} = Bunch.Map.get_updated!(state, :video_base_dts, &(&1 || dts)) + {{dts, pts}, state} = buffer_timings(buffer, state) case Native.write_video_frame( state.native, buffer.payload, - dts - base_dts, - pts - base_dts, + dts, + pts, buffer.metadata.h264.key_frame? ) do {:ok, native} -> @@ -321,4 +328,19 @@ defmodule Membrane.RTMP.Sink do raise "writing video frame failed with reason: #{inspect(reason)}" end end + + defp buffer_timings(buffer, state) do + dts = buffer.dts || buffer.pts + pts = buffer.pts || buffer.dts + correct_timings(dts, pts, state) + end + + defp correct_timings(dts, pts, %{reset_timestamps: false} = state) do + {{dts, pts}, state} + end + + defp correct_timings(dts, pts, state) do + {base_dts, state} = Bunch.Map.get_updated!(state, :video_base_dts, &(&1 || dts)) + {{dts - base_dts, pts - base_dts}, state} + end end diff --git a/mix.exs b/mix.exs index 010e186c..8a54ca7c 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Membrane.RTMP.Mixfile do use Mix.Project - @version "0.23.3" + @version "0.23.4" @github_url "https://github.com/membraneframework/membrane_rtmp_plugin" def project do