@@ -6,10 +6,18 @@ defmodule Membrane.HLS.Source.ClientGenServer do
66 use GenServer
77 alias ExHLS.Client
88
9- @ spec start_link ( String . t ( ) , ExHLS.DemuxingEngine.CMAF | ExHLS.DemuxingEngine.MPEGTS ) ::
9+ @ spec start_link (
10+ String . t ( ) ,
11+ ExHLS.DemuxingEngine.CMAF | ExHLS.DemuxingEngine.MPEGTS ,
12+ Membrane.HLS.Source . variant_selection_policy ( )
13+ ) ::
1014 GenServer . on_start ( )
11- def start_link ( url , demuxing_engine ) do
12- GenServer . start_link ( __MODULE__ , url: url , demuxing_engine: demuxing_engine )
15+ def start_link ( url , demuxing_engine , variant_selection_policy ) do
16+ GenServer . start_link ( __MODULE__ ,
17+ url: url ,
18+ demuxing_engine: demuxing_engine ,
19+ variant_selection_policy: variant_selection_policy
20+ )
1321 end
1422
1523 @ spec request_audio ( pid ( ) ) :: :ok
@@ -28,11 +36,44 @@ defmodule Membrane.HLS.Source.ClientGenServer do
2836 end
2937
3038 @ impl true
31- def init ( url: url , demuxing_engine: demuxing_engine ) do
32- client = Client . new ( url , demuxing_engine )
33- variant_id = Client . get_variants ( client ) |> Enum . at ( 0 ) |> elem ( 0 )
34- client = Client . choose_variant ( client , variant_id )
35- { :ok , % { client: client } }
39+ def init (
40+ url: url ,
41+ demuxing_engine: demuxing_engine ,
42+ variant_selection_policy: variant_selection_policy
43+ ) do
44+ state = % {
45+ client: Client . new ( url , demuxing_engine ) ,
46+ variant_selection_policy: variant_selection_policy
47+ }
48+
49+ { :ok , state |> choose_variant ( ) }
50+ end
51+
52+ defp choose_variant ( state ) do
53+ variants = Client . get_variants ( state . client )
54+ get_resolution = fn { _id , % { resolution: { width , height } } } -> width * height end
55+ get_bandwidth = fn { _id , % { bandwidth: bandwidth } } -> bandwidth end
56+
57+ chosen_variant_id =
58+ case state . variant_selection_policy do
59+ :lowest_resolution ->
60+ variants |> Enum . min_by ( get_resolution ) |> elem ( 0 )
61+
62+ :highest_resolution ->
63+ variants |> Enum . max_by ( get_resolution ) |> elem ( 0 )
64+
65+ :lowest_bandwidth ->
66+ variants |> Enum . min_by ( get_bandwidth ) |> elem ( 0 )
67+
68+ :highest_bandwidth ->
69+ variants |> Enum . max_by ( get_bandwidth ) |> elem ( 0 )
70+
71+ custom_policy when is_function ( custom_policy , 1 ) ->
72+ variants |> custom_policy . ( )
73+ end
74+
75+ client = state . client |> Client . choose_variant ( chosen_variant_id )
76+ % { state | client: client }
3677 end
3778
3879 @ impl true
0 commit comments