|
| 1 | +defmodule Membrane.Buffer.Metric.ByteSize do |
| 2 | + @moduledoc """ |
| 3 | + Implementation of `Membrane.Buffer.Metric` for the `:bytes` unit. |
| 4 | +
|
| 5 | + > #### Deprecated {: .warning} |
| 6 | + > This module is deprecated. Use `Membrane.Core.Metric` functions with `:bytes` as the |
| 7 | + > `demand_unit` argument instead. |
| 8 | + """ |
| 9 | + |
| 10 | + @behaviour Membrane.Buffer.Metric |
| 11 | + |
| 12 | + require Membrane.Logger |
| 13 | + |
| 14 | + alias Membrane.{Buffer, Payload} |
| 15 | + |
| 16 | + @impl true |
| 17 | + def buffer_size_approximation() do |
| 18 | + ensure_deprecated_warning_printed() |
| 19 | + 1500 |
| 20 | + end |
| 21 | + |
| 22 | + @impl true |
| 23 | + def init_manual_demand_size() do |
| 24 | + ensure_deprecated_warning_printed() |
| 25 | + 0 |
| 26 | + end |
| 27 | + |
| 28 | + @impl true |
| 29 | + def buffers_size(buffers) do |
| 30 | + ensure_deprecated_warning_printed() |
| 31 | + |
| 32 | + buffers |
| 33 | + |> Enum.reduce(0, fn %Buffer{payload: p}, acc -> acc + Payload.size(p) end) |
| 34 | + |> then(&{:ok, &1}) |
| 35 | + end |
| 36 | + |
| 37 | + @impl true |
| 38 | + def split_buffers(buffers, count, _first_consumed_buffer, _last_consumed_buffer) do |
| 39 | + ensure_deprecated_warning_printed() |
| 40 | + do_split_buffers(buffers, count, []) |
| 41 | + end |
| 42 | + |
| 43 | + @impl true |
| 44 | + def reduce_demand(demand, consumed) do |
| 45 | + ensure_deprecated_warning_printed() |
| 46 | + demand - consumed |
| 47 | + end |
| 48 | + |
| 49 | + defp ensure_deprecated_warning_printed() do |
| 50 | + if Process.get({__MODULE__, :deprecated_warned}) == nil do |
| 51 | + Membrane.Logger.warning( |
| 52 | + "#{__MODULE__} is deprecated. Use Membrane.Core.Metric with :bytes demand_unit instead." |
| 53 | + ) |
| 54 | + |
| 55 | + Process.put({__MODULE__, :deprecated_warned}, true) |
| 56 | + end |
| 57 | + end |
| 58 | + |
| 59 | + defp do_split_buffers(buffers, at_pos, acc) when at_pos == 0 or buffers == [] do |
| 60 | + {acc |> Enum.reverse(), buffers} |
| 61 | + end |
| 62 | + |
| 63 | + defp do_split_buffers([%Buffer{payload: p} = buf | rest], at_pos, acc) when at_pos > 0 do |
| 64 | + if at_pos < Payload.size(p) do |
| 65 | + {p1, p2} = Payload.split_at(p, at_pos) |
| 66 | + acc = [%Buffer{buf | payload: p1} | acc] |> Enum.reverse() |
| 67 | + rest = [%Buffer{buf | payload: p2} | rest] |
| 68 | + {acc, rest} |
| 69 | + else |
| 70 | + do_split_buffers(rest, at_pos - Payload.size(p), [buf | acc]) |
| 71 | + end |
| 72 | + end |
| 73 | +end |
0 commit comments