Expand convert presets and relative scaling
This commit is contained in:
parent
43eae3d17e
commit
3f356f9a74
43
main.go
43
main.go
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user