defmodule Xav do
@moduledoc File.read!("README.md")
@type encoder :: %{
codec: atom(),
name: atom(),
long_name: String.t(),
media_type: atom(),
profiles: [String.t()],
sample_formats: [atom()]
}
@type decoder :: %{
codec: atom(),
name: atom(),
long_name: String.t(),
media_type: atom()
}
@doc """
Get all available pixel formats.
The result is a list of 3-element tuples `{name, nb_components, hw_accelerated_format?}`:
* `name` - The name of the pixel format.
* `nb_components` - The number of the components in the pixel format.
* `hw_accelerated_format?` - Whether the pixel format is a hardware accelerated format.
"""
@spec pixel_formats() :: [{atom(), integer(), boolean()}]
def pixel_formats(), do: Xav.Decoder.NIF.pixel_formats() |> Enum.reverse()
@doc """
Get all available audio sample formats.
The result is a list of 2-element tuples `{name, nb_bytes}`:
* `name` - The name of the sample format.
* `nb_bytes` - The number of bytes per sample.
"""
@spec sample_formats() :: [{atom(), integer()}]
def sample_formats(), do: Xav.Decoder.NIF.sample_formats() |> Enum.reverse()
@doc """
List all decoders.
"""
@spec list_decoders() :: [decoder()]
def list_decoders() do
Xav.Decoder.NIF.list_decoders()
|> Enum.map(fn {codec, name, long_name, media_type} ->
%{
codec: codec,
name: name,
long_name: List.to_string(long_name),
media_type: media_type
}
end)
|> Enum.reverse()
end
@doc """
List all encoders.
"""
@spec list_encoders() :: [encoder()]
def list_encoders() do
Xav.Encoder.NIF.list_encoders()
|> Enum.map(fn {family_name, name, long_name, media_type, _codec_id, profiles, sample_formats,
sample_rates} ->
%{
codec: family_name,
name: name,
long_name: List.to_string(long_name),
media_type: media_type,
profiles: profiles |> Enum.map(&List.to_string/1) |> Enum.reverse(),
sample_formats: Enum.reverse(sample_formats),
sample_rates: Enum.reverse(sample_rates)
}
end)
|> Enum.reverse()
end
end