Packages
vtc
0.8.2
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.Timecode.Sections do
@moduledoc """
Holds the individual sections of a 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.Timecode
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_timecode(Timecode.t(), opts :: [round: Timecode.round()]) :: t()
def from_timecode(timecode, opts) do
round = Keyword.get(opts, :round, :closest)
rate = timecode.rate
timebase = Framerate.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 =
timecode
|> Timecode.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?(timecode.seconds, 0),
hours: hours,
minutes: minutes,
seconds: seconds,
frames: Rational.round(frames, round)
}
end
end