lib/rav1e_native.ex

defmodule Rav1e do
  defstruct [:rav1e, :config]

  @doc """
  Initialize encoder.
  """
  def init(%Rav1e.EncoderConfig{} = config) do
    rav1e = Rav1e.Native.init(config)
    %Rav1e{rav1e: rav1e, config: config}
  end

  @doc """
  Encode a single frame.

  Will return a either an AV1 packet or a `rav1e::api::util::EncoderState`.
  """
  def encode(%Rav1e{rav1e: rav1e}, y_plane, u_plane, v_plane) do
    Rav1e.Native.encode(rav1e, y_plane, u_plane, v_plane)
  end

  @doc """
  Encode remaining frames in the encoders internal buffer.
  """
  def flush(%Rav1e{rav1e: rav1e}), do: Rav1e.Native.flush(rav1e)
end

defmodule Rav1e.Native do
  use Rustler, otp_app: :rav1e, crate: "rav1e_native", mode: :release

  def init(_settings), do: :erlang.nif_error(:nif_not_loaded)
  def encode(_rav1e, _y_plane, _u_plane, _v_plane), do: :erlang.nif_error(:nif_not_loaded)
  def flush(_rav1e), do: :erlang.nif_error(:nif_not_loaded)
end