Packages
vtc
0.14.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/timecode_sections.ex
defmodule Vtc.SMPTETimecode.Sections do
@moduledoc """
Holds the individual sections of a SMPTE timecode for formatting / manipulation.
## Struct Fields
- `negative`: Whether the timecode is less than 0.
- `hours`: Hours place value.
- `minutes`: Minutes place value. This is not the toal minutes, but the minutes added
to `hours` to get a final time.
- `seconds`: Seconds place value. As minutes, remainder value rather than total
value.
- `frames`: Frames place value. As seconds, remainder value rather than total
value.
"""
alias Vtc.Framerate
alias Vtc.Framestamp
alias Vtc.Utils.Consts
alias Vtc.Utils.DropFrame
alias Vtc.Utils.Rational
@enforce_keys [:negative?, :hours, :minutes, :seconds, :frames]
defstruct [:negative?, :hours, :minutes, :seconds, :frames]
@typedoc """
Struct type.
"""
@type t :: %__MODULE__{
negative?: boolean(),
hours: integer(),
minutes: integer(),
seconds: integer(),
frames: integer()
}
@doc false
@spec from_framestamp(Framestamp.t(), opts :: [round: Framestamp.round()]) :: t()
def from_framestamp(framestamp, opts) do
round = Keyword.get(opts, :round, :closest)
rate = framestamp.rate
timebase = Framerate.smpte_timebase(rate)
frames_per_minute = Ratio.mult(timebase, Ratio.new(Consts.seconds_per_minute()))
frames_per_hour = Ratio.mult(timebase, Ratio.new(Consts.seconds_per_hour()))
total_frames =
framestamp
|> Framestamp.frames(opts)
|> Kernel.abs()
|> then(&(&1 + DropFrame.frame_num_adjustment(&1, rate)))
{hours, remainder} = total_frames |> Ratio.new() |> Rational.divrem(frames_per_hour)
{minutes, remainder} = Rational.divrem(remainder, frames_per_minute)
{seconds, frames} = Rational.divrem(remainder, timebase)
%__MODULE__{
negative?: Ratio.lt?(framestamp.seconds, 0),
hours: hours,
minutes: minutes,
seconds: seconds,
frames: Rational.round(frames, round)
}
end
end