Hide unused bitrate controls and improve VBR accuracy

Restructured bitrate controls to hide unused options based on mode,
and improved VBR encoding to use 2-pass for accurate bitrate targeting.

UI Improvements:
- Wrapped CRF, bitrate, and target size controls in hideable containers
- Only show relevant controls based on selected bitrate mode:
  * CRF mode: Show only CRF entry
  * CBR mode: Show only bitrate entry and presets
  * VBR mode: Show only bitrate entry and presets
  * Target Size mode: Show only target size controls
- Added descriptive hints for each mode explaining behavior
- Updated DVD mode to work with new container structure
- Made command preview update when bitrate settings change

Encoding Improvements:
- VBR now uses maxrate at 1.5x target for quality peaks
- VBR automatically enables 2-pass encoding for accuracy
- CBR remains strict (minrate=maxrate=target) for guaranteed bitrate
- Target Size mode continues to calculate exact bitrate from duration

This addresses runaway bitrate issues by:
1. Making it clear which mode is active
2. Hiding confusing unused controls
3. Ensuring VBR hits target average bitrate with 2-pass
4. Keeping CBR strict for exact constant bitrate

Pros of manual bitrate targeting:
- Predictable file sizes
- Meets strict size requirements
- Good for streaming with bandwidth constraints

Cons of manual bitrate targeting:
- Variable quality (simple scenes waste bits, complex scenes starve)
- Less efficient than CRF overall
- Requires 2-pass for VBR accuracy (slower)
This commit is contained in:
Stu Leak 2025-12-18 10:18:25 -05:00
parent a7439c0d5d
commit 0ebd442479

15
main.go
View File

@ -6227,19 +6227,20 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
// Hide bitrate/target-size fields to declutter in locked DVD mode // Hide bitrate/target-size fields to declutter in locked DVD mode
bitratePresetSelect.Hide() bitratePresetSelect.Hide()
simpleBitrateSelect.Hide() simpleBitrateSelect.Hide()
targetFileSizeEntry.Hide() crfContainer.Hide()
targetFileSizeSelect.Hide() targetSizeContainer.Hide()
crfEntry.Hide() // Show bitrate controls since DVD uses CBR
bitrateContainer.Show()
dvdInfoLabel.SetText(fmt.Sprintf("%s\nLocked: resolution, frame rate, aspect, codec, pixel format, bitrate, and GPU toggles for DVD compliance.", dvdNotes)) dvdInfoLabel.SetText(fmt.Sprintf("%s\nLocked: resolution, frame rate, aspect, codec, pixel format, bitrate, and GPU toggles for DVD compliance.", dvdNotes))
} else { } else {
dvdAspectBox.Hide() dvdAspectBox.Hide()
// Re-show hidden controls // Re-enable normal visibility control through updateEncodingControls
bitratePresetSelect.Show() bitratePresetSelect.Show()
simpleBitrateSelect.Show() simpleBitrateSelect.Show()
targetFileSizeEntry.Show() if updateEncodingControls != nil {
targetFileSizeSelect.Show() updateEncodingControls()
crfEntry.Show() }
} }
} }
updateDVDOptions() updateDVDOptions()