Packages
vtc
0.10.1
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.15
0.13.14
0.13.13
0.13.12
0.13.11
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.10
0.10.9
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
A SMPTE timecode library for Elixir
Current section
Files
Jump to
Current section
Files
lib/sources/seconds/premiere_ticks.ex
defmodule Vtc.Source.Seconds.PremiereTicks do
@moduledoc """
Implements [Seconds](`Vtc.Source.Seconds`) protocol for Premiere ticks. See
`Vtc.Timecode.premiere_ticks/2` for more information on this unit.
This struct is used as an input wrapper only, not as the general-purpose Premiere
ticks unit.
"""
alias Vtc.Timecode
alias Vtc.Utils.Rational
@enforce_keys [:in]
defstruct [:in]
@typedoc """
Contains only a single field for wrapping the underlying integer.
"""
@type t() :: %__MODULE__{in: integer()}
@doc """
Returns the number of ticks in a second.
"""
@spec per_second() :: pos_integer()
def per_second, do: 254_016_000_000
@doc false
@spec from_timecode(Timecode.t(), opts :: [round: Timecode.round()]) :: t()
def from_timecode(timecode, opts) do
round = Keyword.get(opts, :round, :closest)
timecode.seconds
|> Ratio.mult(Ratio.new(per_second()))
|> Rational.round(round)
|> then(&%__MODULE__{in: &1})
end
end
defimpl Vtc.Source.Seconds, for: Vtc.Source.Seconds.PremiereTicks do
@moduledoc """
Implements [Seconds](`Vtc.Source.Seconds`) protocol for Premiere ticks.
"""
alias Vtc.Framerate
alias Vtc.Source.Seconds
alias Vtc.Source.Seconds.PremiereTicks
@spec seconds(PremiereTicks.t(), Framerate.t()) :: Seconds.result()
def seconds(ticks, _), do: {:ok, Ratio.new(ticks.in, PremiereTicks.per_second())}
end