L'encoder scende in congestione e risale piano; la regia imposta il pavimento, mostra lo stato del telefono e apre il selettore dal bitrate colorato. Co-authored-by: Cursor <cursoragent@cursor.com>
60 lines
2.0 KiB
Ruby
60 lines
2.0 KiB
Ruby
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
|