Expand convert presets and relative scaling

This commit is contained in:
Stu Leak 2025-12-13 23:08:54 -05:00
parent 43eae3d17e
commit 3f356f9a74

43
main.go
View File

@ -3757,7 +3757,14 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
updateQualityVisibility func() updateQualityVisibility func()
) )
qualityOptions := []string{"Draft (CRF 28)", "Standard (CRF 23)", "High (CRF 18)", "Lossless"} qualityOptions := []string{
"Draft (CRF 28)",
"Standard (CRF 23)",
"Balanced (CRF 20)",
"High (CRF 18)",
"Near-Lossless (CRF 16)",
"Lossless",
}
var syncingQuality bool var syncingQuality bool
qualitySelectSimple = widget.NewSelect(qualityOptions, func(value string) { qualitySelectSimple = widget.NewSelect(qualityOptions, func(value string) {
@ -3792,6 +3799,9 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
syncingQuality = false syncingQuality = false
}) })
if !slices.Contains(qualityOptions, state.convert.Quality) {
state.convert.Quality = "Standard (CRF 23)"
}
qualitySelectSimple.SetSelected(state.convert.Quality) qualitySelectSimple.SetSelected(state.convert.Quality)
qualitySelectAdv.SetSelected(state.convert.Quality) qualitySelectAdv.SetSelected(state.convert.Quality)
@ -4338,7 +4348,8 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
// Simple resolution selector (separate widget to avoid double-parent issues) // Simple resolution selector (separate widget to avoid double-parent issues)
resolutionSelectSimple := widget.NewSelect([]string{ resolutionSelectSimple := widget.NewSelect([]string{
"Source", "360p", "480p", "540p", "720p", "1080p", "1440p", "4K", "Source", "360p", "480p", "540p", "720p", "1080p", "1440p", "4K", "8K",
"2X (relative)", "4X (relative)",
"NTSC (720×480)", "PAL (720×540)", "PAL (720×576)", "NTSC (720×480)", "PAL (720×540)", "PAL (720×576)",
}, func(value string) { }, func(value string) {
state.convert.TargetResolution = value state.convert.TargetResolution = value
@ -4522,7 +4533,11 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
updateEncodingControls() updateEncodingControls()
// Target Resolution (advanced) // Target Resolution (advanced)
resolutionSelect := widget.NewSelect([]string{"Source", "720p", "1080p", "1440p", "4K", "NTSC (720×480)", "PAL (720×540)", "PAL (720×576)"}, func(value string) { resolutionSelect := widget.NewSelect([]string{
"Source", "720p", "1080p", "1440p", "4K", "8K",
"2X (relative)", "4X (relative)",
"NTSC (720×480)", "PAL (720×540)", "PAL (720×576)",
}, func(value string) {
state.convert.TargetResolution = value state.convert.TargetResolution = value
logging.Debug(logging.CatUI, "target resolution set to %s", value) logging.Debug(logging.CatUI, "target resolution set to %s", value)
}) })
@ -7121,10 +7136,14 @@ func (s *appState) prevVideo() {
func crfForQuality(q string) string { func crfForQuality(q string) string {
switch q { switch q {
case "Balanced (CRF 20)":
return "20"
case "Draft (CRF 28)": case "Draft (CRF 28)":
return "28" return "28"
case "High (CRF 18)": case "High (CRF 18)":
return "18" return "18"
case "Near-Lossless (CRF 16)":
return "16"
case "Lossless": case "Lossless":
return "0" return "0"
default: default:
@ -7478,6 +7497,12 @@ func (s *appState) startConvert(status *widget.Label, btn, cancelBtn *widget.But
// Scaling/Resolution // Scaling/Resolution
if cfg.TargetResolution != "" && cfg.TargetResolution != "Source" { if cfg.TargetResolution != "" && cfg.TargetResolution != "Source" {
var scaleFilter string var scaleFilter string
makeEven := func(v int) int {
if v%2 != 0 {
return v + 1
}
return v
}
switch cfg.TargetResolution { switch cfg.TargetResolution {
case "720p": case "720p":
scaleFilter = "scale=-2:720" scaleFilter = "scale=-2:720"
@ -7495,6 +7520,18 @@ func (s *appState) startConvert(status *widget.Label, btn, cancelBtn *widget.But
scaleFilter = "scale=720:540" scaleFilter = "scale=720:540"
case "PAL (720×576)": case "PAL (720×576)":
scaleFilter = "scale=720:576" scaleFilter = "scale=720:576"
case "2X (relative)":
if src != nil {
w := makeEven(src.Width * 2)
h := makeEven(src.Height * 2)
scaleFilter = fmt.Sprintf("scale=%d:%d", w, h)
}
case "4X (relative)":
if src != nil {
w := makeEven(src.Width * 4)
h := makeEven(src.Height * 4)
scaleFilter = fmt.Sprintf("scale=%d:%d", w, h)
}
} }
if scaleFilter != "" { if scaleFilter != "" {
vf = append(vf, scaleFilter) vf = append(vf, scaleFilter)