module Sessions # Sceglie il preset più alto supportato dall'upload misurato (test rete). class SelectQuality UPLOAD_HEADROOM = 0.8 UPLOAD_HEADROOM_1080P = 1.0 AUTO_ID = "auto" AUTO_FLOOR_BITRATE = 800_000 PRESETS = [ { id: "1080p_30_4.5mbps", target_bitrate: 4_500_000, target_fps: 30 }, { id: "720p_30_4mbps", target_bitrate: 4_000_000, target_fps: 30 }, { id: "720p_30_2.5mbps", target_bitrate: 2_500_000, target_fps: 30 }, { id: "720p_30_1.5mbps", target_bitrate: 1_500_000, target_fps: 30 } ].freeze MIN_QUALITY_IDS = ([AUTO_ID] + PRESETS.map { |preset| preset[:id] }).freeze def self.floor_bitrate(preset_id) return AUTO_FLOOR_BITRATE if preset_id.blank? || preset_id == AUTO_ID PRESETS.find { |preset| preset[:id] == preset_id }&.fetch(:target_bitrate) || AUTO_FLOOR_BITRATE end def self.allowed_min_ids(session_preset) ids = [AUTO_ID] + PRESETS.reject { |preset| preset[:id].start_with?("1080p") }.reverse.map { |preset| preset[:id] } ids << "1080p_30_4.5mbps" if session_preset.to_s.start_with?("1080p") ids end def self.display_name(preset_id) return AUTO_ID if preset_id.blank? || preset_id == AUTO_ID preset = PRESETS.find { |item| item[:id] == preset_id } return preset_id unless preset resolution = preset[:id].start_with?("1080p") ? "1080p" : "720p" mbps = preset[:target_bitrate] / 1_000_000.0 mbps_text = (mbps == mbps.to_i) ? mbps.to_i.to_s : format("%.1f", mbps) "#{resolution} · #{mbps_text} Mbps" end def self.call(upload_mbps:) new(upload_mbps: upload_mbps).call end def initialize(upload_mbps:) @upload_mbps = upload_mbps.to_f end def call PRESETS.find { |preset| upload_sufficient?(preset) } || PRESETS.last end def upload_sufficient?(preset) headroom = preset[:id].start_with?("1080p") ? UPLOAD_HEADROOM_1080P : UPLOAD_HEADROOM @upload_mbps >= (preset[:target_bitrate] / 1_000_000.0 * headroom) end end end