lib/membrane_mp4/payloader/opus.ex

defmodule Membrane.MP4.Payloader.Opus do
  @moduledoc """
  MP4 Payloader for Opus codec.
  """
  use Membrane.Filter

  alias Membrane.MP4.Payload
  alias Membrane.Opus

  def_input_pad :input,
    availability: :always,
    accepted_format: %Opus{self_delimiting?: false},
    demand_unit: :buffers

  def_output_pad :output,
    availability: :always,
    accepted_format: Payload

  @impl true
  def handle_init(_ctx, _opts) do
    {[], %{}}
  end

  @impl true
  def handle_demand(:output, size, :buffers, _ctx, state) do
    {[demand: {:input, size}], state}
  end

  @impl true
  def handle_stream_format(:input, stream_format, _ctx, state) do
    stream_format = %Payload{
      content: stream_format,
      timescale: 48_000
    }

    {[stream_format: {:output, stream_format}], state}
  end

  @impl true
  def handle_process(:input, buffer, _ctx, state) do
    {[buffer: {:output, buffer}], state}
  end
end