-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathutil.ex
69 lines (64 loc) · 3.03 KB
/
util.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
defmodule Membrane.Opus.Util do
@moduledoc false
# Miscellaneous utility functions
import Membrane.Time
@spec parse_toc_byte(data :: binary) ::
{:ok, config_number :: 0..31, stereo_flag :: 0..1, frame_packing :: 0..3} | :error
def parse_toc_byte(
<<config_number::size(5), stereo_flag::size(1), frame_packing::size(2), _rest::binary>>
) do
{:ok, config_number, stereo_flag, frame_packing}
end
def parse_toc_byte(_data) do
:error
end
@spec parse_channels(stereo_flag :: 0..1) :: channels :: 1..2
def parse_channels(stereo_flag) when stereo_flag in 0..1 do
stereo_flag + 1
end
@spec parse_configuration(config_number :: 0..31) ::
{:ok, mode :: :silk | :hybrid | :celt,
bandwidth :: :narrow | :medium | :wide | :super_wide | :full,
frame_duration :: Membrane.Time.non_neg_t()}
| :error
# Credo CC check thinks that this function is super complex, but for an actual human it isn't.
# Therefore, it makes sense to disable the check for this function
# credo:disable-for-next-line
def parse_configuration(configuration_number) do
case configuration_number do
0 -> {:ok, :silk, :narrow, 10 |> milliseconds()}
1 -> {:ok, :silk, :narrow, 20 |> milliseconds()}
2 -> {:ok, :silk, :narrow, 40 |> milliseconds()}
3 -> {:ok, :silk, :narrow, 60 |> milliseconds()}
4 -> {:ok, :silk, :medium, 10 |> milliseconds()}
5 -> {:ok, :silk, :medium, 20 |> milliseconds()}
6 -> {:ok, :silk, :medium, 40 |> milliseconds()}
7 -> {:ok, :silk, :medium, 60 |> milliseconds()}
8 -> {:ok, :silk, :wide, 10 |> milliseconds()}
9 -> {:ok, :silk, :wide, 20 |> milliseconds()}
10 -> {:ok, :silk, :wide, 40 |> milliseconds()}
11 -> {:ok, :silk, :wide, 60 |> milliseconds()}
12 -> {:ok, :hybrid, :super_wide, 10 |> milliseconds()}
13 -> {:ok, :hybrid, :super_wide, 20 |> milliseconds()}
14 -> {:ok, :hybrid, :full, 10 |> milliseconds()}
15 -> {:ok, :hybrid, :full, 20 |> milliseconds()}
16 -> {:ok, :celt, :narrow, (2.5 * 1_000_000) |> trunc() |> nanoseconds()}
17 -> {:ok, :celt, :narrow, 5 |> milliseconds()}
18 -> {:ok, :celt, :narrow, 10 |> milliseconds()}
19 -> {:ok, :celt, :narrow, 20 |> milliseconds()}
20 -> {:ok, :celt, :wide, (2.5 * 1_000_000) |> trunc() |> nanoseconds()}
21 -> {:ok, :celt, :wide, 5 |> milliseconds()}
22 -> {:ok, :celt, :wide, 10 |> milliseconds()}
23 -> {:ok, :celt, :wide, 20 |> milliseconds()}
24 -> {:ok, :celt, :super_wide, (2.5 * 1_000_000) |> trunc() |> nanoseconds()}
25 -> {:ok, :celt, :super_wide, 5 |> milliseconds()}
26 -> {:ok, :celt, :super_wide, 10 |> milliseconds()}
27 -> {:ok, :celt, :super_wide, 20 |> milliseconds()}
28 -> {:ok, :celt, :full, (2.5 * 1_000_000) |> trunc() |> nanoseconds()}
29 -> {:ok, :celt, :full, 5 |> milliseconds()}
30 -> {:ok, :celt, :full, 10 |> milliseconds()}
31 -> {:ok, :celt, :full, 20 |> milliseconds()}
_otherwise -> :error
end
end
end