Current section
Files
Jump to
Current section
Files
lib/membrane/live_compositor/encoder.ex
defmodule Membrane.LiveCompositor.Encoder do
@moduledoc false
defmodule FFmpegH264 do
@moduledoc """
Options for H264 encoder from FFmpeg.
"""
@typedoc """
Encoder preset. See [FFmpeg docs](https://trac.ffmpeg.org/wiki/Encode/H.264#Preset)
to learn more.
"""
@type encoder_preset ::
:ultrafast
| :superfast
| :veryfast
| :faster
| :fast
| :medium
| :slow
| :slower
| :veryslow
| :placebo
@typedoc """
Raw FFmpeg encoder options. See [docs](https://ffmpeg.org/ffmpeg-codecs.html) for more.
"""
@type ffmpeg_options :: %{(String.t() | atom()) => String.t()} | nil
defstruct preset: :fast, ffmpeg_options: nil
@type t :: %__MODULE__{
preset: encoder_preset(),
ffmpeg_options: ffmpeg_options()
}
end
defimpl Jason.Encoder, for: FFmpegH264 do
@spec encode(FFmpegH264.t(), Jason.Encode.opts()) :: iodata
def encode(value, opts) do
Jason.Encode.map(
Map.take(value, [:preset, :ffmpeg_options]) |> Map.put(:type, :ffmpeg_h264),
opts
)
end
end
defmodule Opus do
@moduledoc """
Options for OPUS encoder.
"""
@typedoc """
Encoder preset.
"""
@type encoder_preset :: :quality | :voip | :lowest_latency
@type channels :: :stereo | :mono
@enforce_keys [:channels]
defstruct @enforce_keys ++ [preset: :voip]
@type t :: %__MODULE__{
preset: encoder_preset(),
channels: channels()
}
end
defimpl Jason.Encoder, for: Opus do
@spec encode(Opus.t(), Jason.Encode.opts()) :: iodata
def encode(value, opts) do
Jason.Encode.map(
Map.take(value, [:preset, :channels]) |> Map.put(:type, :opus),
opts
)
end
end
end