fix(transcode): make preset libx264-only + restore quality opt-in
Two issues with the 0.9.9 preset retune: 1. applyDefaults was filling Preset="veryfast" before ResolveEncoderProfile got to pick the latency-biased default, so the "superfast" change never reached users with a freshly-generated config.toml — only those who left the field empty saw it. 2. The configured preset was being passed through to every encoder. That's only valid for libx264 (ultrafast…veryslow); NVENC uses p1-p7 and rejects anything else, QSV uses its own subset. A user with NVENC + preset="veryfast" would have ffmpeg reject the argv. Now: - TranscodeConfig.Preset documented as libx264-only with the full range + advice on quality vs first-start latency. - Default in applyDefaults is empty (was "veryfast") so the engine fills in "superfast" on libx264. - ResolveEncoderProfile ignores configuredPreset for vendor encoders (NVENC sticks to p3, QSV to veryfast, VideoToolbox has no preset knob). Test cases updated to lock in this behaviour. Users who want better quality at slower first-play should set download.transcode.preset = "veryfast" (previous default) / "faster" / "fast" / "medium" in their config.toml.
This commit is contained in:
parent
3b8d77b496
commit
0f4ad67827
5 changed files with 72 additions and 20 deletions
|
|
@ -96,9 +96,27 @@ type VPNConfig struct {
|
|||
// Disabled by default; enabling requires ffmpeg + ffprobe on PATH (or
|
||||
// explicit paths via the library config).
|
||||
type TranscodeConfig struct {
|
||||
Enabled bool `toml:"enabled"` // master switch
|
||||
HWAccel string `toml:"hw_accel"` // "auto" | "none" | "nvenc" | "qsv" | "vaapi" | "videotoolbox"
|
||||
Preset string `toml:"preset"` // libx264 preset; "veryfast" by default
|
||||
Enabled bool `toml:"enabled"` // master switch
|
||||
HWAccel string `toml:"hw_accel"` // "auto" | "none" | "nvenc" | "qsv" | "vaapi" | "videotoolbox"
|
||||
// Preset is the encoder speed/quality dial. Only used on software encode
|
||||
// (libx264) — HW backends (NVENC/QSV/VAAPI/VideoToolbox) use vendor
|
||||
// presets that don't share libx264's vocabulary and would be rejected
|
||||
// by ffmpeg if passed here.
|
||||
//
|
||||
// Empty (default) → engine picks "superfast" — latency-biased, ~3 s
|
||||
// first-play on 1080p source on a modern x86 CPU. Marginal quality loss
|
||||
// at 5-25 Mbps target bitrates.
|
||||
//
|
||||
// For better quality at slower first-play (1-2 s slower per seg):
|
||||
// "veryfast" — previous default; balanced
|
||||
// "faster" — slight quality bump
|
||||
// "fast" — meaningful quality bump
|
||||
// "medium" — libx264 stock default; CPU-bound on 4K
|
||||
// "slow" / "slower" / "veryslow" — only for batch encodes, not real-time HLS
|
||||
//
|
||||
// Or faster:
|
||||
// "ultrafast" — lowest quality, fastest encode
|
||||
Preset string `toml:"preset"`
|
||||
VideoBitrate string `toml:"video_bitrate"` // e.g. "5M"
|
||||
AudioBitrate string `toml:"audio_bitrate"` // e.g. "192k"
|
||||
MaxHeight int `toml:"max_height"` // optional downscale cap (e.g. 720)
|
||||
|
|
@ -176,7 +194,10 @@ func Default() Config {
|
|||
Transcode: TranscodeConfig{
|
||||
Enabled: true,
|
||||
HWAccel: "auto",
|
||||
Preset: "veryfast",
|
||||
// Empty preset → engine.ResolveEncoderProfile picks the
|
||||
// latency-biased default ("superfast" on libx264). Override
|
||||
// in config.toml when quality > first-start latency matters.
|
||||
Preset: "",
|
||||
AudioBitrate: "192k",
|
||||
MaxConcurrent: 2,
|
||||
},
|
||||
|
|
@ -280,7 +301,12 @@ func applyDefaults(cfg *Config, meta toml.MetaData) {
|
|||
cfg.Download.Transcode.HWAccel = "auto"
|
||||
}
|
||||
if !meta.IsDefined("downloads", "transcode", "preset") {
|
||||
cfg.Download.Transcode.Preset = "veryfast"
|
||||
// Empty = let engine.ResolveEncoderProfile pick the latency-biased
|
||||
// default ("superfast" on libx264). Users wanting better quality at
|
||||
// slower first-play can override to "veryfast" / "fast" / "medium" in
|
||||
// config.toml. Ignored when hw_accel picks NVENC/QSV/VAAPI/VideoToolbox
|
||||
// (those have built-in vendor presets).
|
||||
cfg.Download.Transcode.Preset = ""
|
||||
}
|
||||
if !meta.IsDefined("downloads", "transcode", "audio_bitrate") {
|
||||
cfg.Download.Transcode.AudioBitrate = "192k"
|
||||
|
|
|
|||
|
|
@ -215,8 +215,11 @@ name = "Test"
|
|||
if cfg.Download.Transcode.HWAccel != "auto" {
|
||||
t.Errorf("Transcode.HWAccel = %q, want auto", cfg.Download.Transcode.HWAccel)
|
||||
}
|
||||
if cfg.Download.Transcode.Preset != "veryfast" {
|
||||
t.Errorf("Transcode.Preset = %q, want veryfast", cfg.Download.Transcode.Preset)
|
||||
if cfg.Download.Transcode.Preset != "" {
|
||||
// Default is now empty — engine.ResolveEncoderProfile picks
|
||||
// "superfast" on libx264 for first-start latency. Users
|
||||
// wanting better quality override in config.toml.
|
||||
t.Errorf("Transcode.Preset = %q, want empty", cfg.Download.Transcode.Preset)
|
||||
}
|
||||
if cfg.Download.Transcode.MaxConcurrent != 2 {
|
||||
t.Errorf("Transcode.MaxConcurrent = %d, want 2", cfg.Download.Transcode.MaxConcurrent)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue