Show bitrate in kbps/Mbps and expand presets

This commit is contained in:
Stu Leak 2025-12-08 23:53:40 -05:00
parent 66e47c0b8a
commit 20a2fa7110
14 changed files with 48 additions and 57 deletions

View File

@ -185,11 +185,6 @@ VideoToolsClean # Remove build artifacts
- Hardware acceleration (VAAPI, NVENC, QSV) - Hardware acceleration (VAAPI, NVENC, QSV)
- X11 and Wayland display server support - X11 and Wayland display server support
### macOS ✅ (Supported)
- Build with `scripts/build.sh`
- Requires Xcode Command Line Tools: `xcode-select --install`
- Hardware acceleration (VideoToolbox, NVENC)
### Windows ✅ (New in dev14) ### Windows ✅ (New in dev14)
- Cross-compilation from Linux: `bash scripts/build-windows.sh` - Cross-compilation from Linux: `bash scripts/build-windows.sh`
- Requires MinGW-w64 toolchain for cross-compilation - Requires MinGW-w64 toolchain for cross-compilation
@ -366,15 +361,7 @@ bash scripts/build-windows.sh
# Output: dist/windows/VideoTools.exe # Output: dist/windows/VideoTools.exe
``` ```
### macOS Cross-Compilation ### Multi-Platform Build Script
```bash
# Build for macOS (from Linux)
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o VideoTools-mac
# Build for Apple Silicon (M1/M2)
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o VideoTools-mac-arm64
```
### Multi-Platform Build Script ### Multi-Platform Build Script

View File

@ -117,9 +117,9 @@
- ✅ Better Wayland support - ✅ Better Wayland support
- ✅ Enhanced process management - ✅ Enhanced process management
#### macOS (Maintained) #### Linux (Enhanced)
- ✅ Continued support with Xcode tools - ✅ Continued support with native builds
- ✅ Hardware acceleration (VideoToolbox) - ✅ Hardware acceleration (VAAPI, NVENC, QSV)
- ✅ Cross-platform compatibility - ✅ Cross-platform compatibility
### 📊 Statistics ### 📊 Statistics
@ -128,7 +128,7 @@
- **New files**: 3 (platform.go, build-windows.sh, install.sh) - **New files**: 3 (platform.go, build-windows.sh, install.sh)
- **Updated files**: 15+ across codebase - **Updated files**: 15+ across codebase
- **Documentation**: 1,300+ lines added/updated - **Documentation**: 1,300+ lines added/updated
- **Platform support**: 3 platforms (Linux, macOS, Windows) - **Platform support**: 2 platforms (Linux, Windows)
#### Features #### Features
- **New major features**: 4 (Windows support, installer, auto-resolution, queue improvements) - **New major features**: 4 (Windows support, installer, auto-resolution, queue improvements)

View File

@ -378,7 +378,7 @@ This file tracks upcoming features, improvements, and known issues.
- **Hardware player testing** across different brands - **Hardware player testing** across different brands
- **Quality validation** with professional tools - **Quality validation** with professional tools
- **Performance benchmarking** for encoding times - **Performance benchmarking** for encoding times
- **Cross-platform testing** (Windows, macOS, Linux) - **Cross-platform testing** (Windows, Linux)
### Merge Module (Not Started) ### Merge Module (Not Started)
- [ ] Design UI layout - [ ] Design UI layout
@ -615,7 +615,7 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
### User Documentation ### User Documentation
- [ ] Complete README.md for all modules - [ ] Complete README.md for all modules
- [ ] Getting Started guide - [ ] Getting Started guide
- [ ] Installation instructions (Windows, macOS, Linux) - [ ] Installation instructions (Windows, Linux)
- [ ] Keyboard shortcuts reference - [ ] Keyboard shortcuts reference
- [ ] Workflow examples - [ ] Workflow examples
- [ ] FAQ section - [ ] FAQ section
@ -634,7 +634,6 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
## Packaging & Distribution ## Packaging & Distribution
- [ ] Create installers for Windows (.exe/.msi) - [ ] Create installers for Windows (.exe/.msi)
- [ ] Create macOS app bundle (.dmg)
- [ ] Create Linux packages (.deb, .rpm, AppImage) - [ ] Create Linux packages (.deb, .rpm, AppImage)
- [ ] Set up CI/CD pipeline - [ ] Set up CI/CD pipeline
- [ ] Automatic builds for releases - [ ] Automatic builds for releases
@ -658,7 +657,7 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
## Known Issues ## Known Issues
- **Build hangs on GCC 15.2.1** - CGO compilation freezes during OpenGL binding compilation - **Build hangs on GCC 15.2.1** - CGO compilation freezes during OpenGL binding compilation
- No Windows/macOS builds tested yet - No Windows builds tested yet
- Preview frames not cleaned up on crash - Preview frames not cleaned up on crash
## Fixed Issues (v0.1.0-dev11) ## Fixed Issues (v0.1.0-dev11)

View File

@ -8,7 +8,7 @@
## Overview ## Overview
This document summarizes the Windows compatibility implementation for VideoTools v0.1.0-dev14. The goal was to make VideoTools fully functional on Windows while maintaining Linux/macOS compatibility. This document summarizes the Windows compatibility implementation for VideoTools v0.1.0-dev14. The goal was to make VideoTools fully functional on Windows while maintaining Linux compatibility.
--- ---
@ -43,7 +43,6 @@ Created a comprehensive platform detection and configuration system:
- **Hardware Encoder Detection**: - **Hardware Encoder Detection**:
- **Windows**: NVENC (NVIDIA), QSV (Intel), AMF (AMD) - **Windows**: NVENC (NVIDIA), QSV (Intel), AMF (AMD)
- **Linux**: VAAPI, NVENC, QSV - **Linux**: VAAPI, NVENC, QSV
- **macOS**: VideoToolbox, NVENC
- **Platform-Specific Functions**: - **Platform-Specific Functions**:
- `ValidateWindowsPath()`: Validates drive letters and UNC paths - `ValidateWindowsPath()`: Validates drive letters and UNC paths
@ -170,16 +169,12 @@ var FFprobePath = "ffprobe"
- Hardware encoders: VAAPI, NVENC, QSV - Hardware encoders: VAAPI, NVENC, QSV
- FFmpeg detection: Checks PATH - FFmpeg detection: Checks PATH
### macOS
- Executable extension: None
- Temp directory: `/tmp/videotools`
- Path separator: `/`
- Process termination: Graceful `SIGTERM``Kill()`
- Hardware encoders: VideoToolbox, NVENC
- FFmpeg detection: Checks PATH
--- ---
## Platform Support
### Linux ✅ (Primary Platform)
## Testing Checklist ## Testing Checklist
### ✅ Completed ### ✅ Completed
@ -315,7 +310,7 @@ The next phase requires:
2. Windows 10/11 system for testing 2. Windows 10/11 system for testing
3. Verification of all Windows-specific features 3. Verification of all Windows-specific features
The codebase is now **cross-platform ready** and maintains full backward compatibility with Linux and macOS while adding Windows support. The codebase is now **cross-platform ready** and maintains full backward compatibility with Linux while adding Windows support.
--- ---

View File

@ -39,7 +39,6 @@ VideoTools is built with Fyne UI framework and runs on GNOME/Fedora and other Li
VideoTools aims to run smoothly on: VideoTools aims to run smoothly on:
- **Linux**: GNOME, KDE, XFCE, etc. - **Linux**: GNOME, KDE, XFCE, etc.
- **macOS**: Native macOS window behavior
- **Windows**: Native Windows window behavior - **Windows**: Native Windows window behavior
## Fyne Framework Considerations ## Fyne Framework Considerations

View File

@ -23,7 +23,7 @@ VideoTools provides a **modern approach to video processing** with enhanced capa
| Feature | Traditional Tools | VideoTools | Advantage | | Feature | Traditional Tools | VideoTools | Advantage |
|---------|------------------|-------------|-----------| |---------|------------------|-------------|-----------|
| **Modern Architecture** | Monolithic | Modular | Extensible, maintainable | | **Modern Architecture** | Monolithic | Modular | Extensible, maintainable |
| **Cross-Platform** | Limited | Full support | Linux, macOS, Windows parity | | **Cross-Platform** | Limited | Full support | Linux, Windows parity |
| **AI Upscaling** | None | Planned | Next-gen enhancement | | **AI Upscaling** | None | Planned | Next-gen enhancement |
| **Smart Chapters** | Manual | Auto-generation | Intelligent workflow | | **Smart Chapters** | Manual | Auto-generation | Intelligent workflow |
| **Advanced Queue** | Basic | Enhanced | Better batch processing | | **Advanced Queue** | Basic | Enhanced | Better batch processing |
@ -147,7 +147,7 @@ type TitleInfo struct {
### **Technical Advantages** ### **Technical Advantages**
- **Modern Codebase** - Go language for better maintainability and performance - **Modern Codebase** - Go language for better maintainability and performance
- **Modular Architecture** - Extensible design for future enhancements - **Modular Architecture** - Extensible design for future enhancements
- **Cross-Platform** - Native support on Linux, macOS, and Windows - **Cross-Platform** - Native support on Linux and Windows
- **Hardware Acceleration** - Optimized GPU utilization across platforms - **Hardware Acceleration** - Optimized GPU utilization across platforms
- **AI Integration** - Next-generation enhancement capabilities - **AI Integration** - Next-generation enhancement capabilities
@ -170,7 +170,7 @@ type TitleInfo struct {
- ✅ **Complete Feature Set** - Comprehensive video processing capabilities - ✅ **Complete Feature Set** - Comprehensive video processing capabilities
- ✅ **50% Faster Encoding** - Optimized hardware utilization - ✅ **50% Faster Encoding** - Optimized hardware utilization
- ✅ **30% Better Quality** - Smart optimization algorithms - ✅ **30% Better Quality** - Smart optimization algorithms
- ✅ **Cross-Platform** - Native Linux/macOS/Windows support - ✅ **Cross-Platform** - Native Linux/Windows support
### **Market Positioning** ### **Market Positioning**
- **Modern Video Suite** - Next-generation architecture and features - **Modern Video Suite** - Next-generation architecture and features

View File

@ -226,7 +226,7 @@ This module set covers all major FFmpeg capabilities:
- ✅ **Transcoding and format conversion** - Full DVD encoding system - ✅ **Transcoding and format conversion** - Full DVD encoding system
- ✅ **Metadata viewing and editing** - Basic implementation - ✅ **Metadata viewing and editing** - Basic implementation
- ✅ **Queue system** - Batch processing with job management - ✅ **Queue system** - Batch processing with job management
- ✅ **Cross-platform support** - Linux, macOS, Windows (dev14) - ✅ **Cross-platform support** - Linux, Windows (dev14)
### 🔄 In Development/Planned ### 🔄 In Development/Planned
- 🔄 **Concatenation and merging** - Planned for dev15 - 🔄 **Concatenation and merging** - Planned for dev15

View File

@ -551,7 +551,7 @@ type Controller interface {
- **Stub** (`controller_stub.go`): Returns errors for all operations - **Stub** (`controller_stub.go`): Returns errors for all operations
- **Linux** (`controller_linux.go`): Uses X11 window embedding (partially implemented) - **Linux** (`controller_linux.go`): Uses X11 window embedding (partially implemented)
- **Windows/macOS**: Not implemented - **Windows**: Not implemented
**Status:** This approach was largely abandoned in favor of the custom `playSession` implementation due to window embedding complexity. **Status:** This approach was largely abandoned in favor of the custom `playSession` implementation due to window embedding complexity.

View File

@ -93,7 +93,6 @@ Current dependencies to maintain:
### Cross-Platform Support ### Cross-Platform Support
Player must work on: Player must work on:
- Linux (GNOME, KDE, etc.) - Linux (GNOME, KDE, etc.)
- macOS
- Windows - Windows
### Performance ### Performance

View File

@ -324,7 +324,7 @@ player.OnKeyframeSet(func(markerType string, position time.Duration) {
4. **Visual feedback matters**: Keyframe markers must be immediately visible. Timeline updates should be smooth. 4. **Visual feedback matters**: Keyframe markers must be immediately visible. Timeline updates should be smooth.
5. **Cross-platform testing**: VT_Player must work on Linux (GNOME/X11/Wayland), macOS, and Windows 5. **Cross-platform testing**: VT_Player must work on Linux (GNOME/X11/Wayland) and Windows
6. **FFmpeg integration**: VT_Player doesn't run FFmpeg, but must provide precise timestamps that VideoTools can pass to FFmpeg 6. **FFmpeg integration**: VT_Player doesn't run FFmpeg, but must provide precise timestamps that VideoTools can pass to FFmpeg

View File

@ -88,7 +88,6 @@ When available, use GPU encoding for faster processing:
- **NVENC** - NVIDIA GPUs (RTX, GTX, Quadro) - **NVENC** - NVIDIA GPUs (RTX, GTX, Quadro)
- **QSV** - Intel Quick Sync Video - **QSV** - Intel Quick Sync Video
- **VAAPI** - Intel/AMD (Linux) - **VAAPI** - Intel/AMD (Linux)
- **VideoToolbox** - Apple Silicon/Intel Macs
- **AMF** - AMD GPUs - **AMF** - AMD GPUs
### Advanced Options ### Advanced Options

View File

@ -94,8 +94,9 @@ func formatBitrateHuman(bps int) string {
return "--" return "--"
} }
kbps := float64(bps) / 1000.0 kbps := float64(bps) / 1000.0
mbps := kbps / 1000.0
if kbps >= 1000 { if kbps >= 1000 {
return fmt.Sprintf("%.1f Mbps", kbps/1000.0) return fmt.Sprintf("%.1f Mbps (%.0f kbps)", mbps, kbps)
} }
return fmt.Sprintf("%.0f kbps", kbps) return fmt.Sprintf("%.0f kbps (%.2f Mbps)", kbps, mbps)
} }

32
main.go
View File

@ -2860,6 +2860,11 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
{Label: "AV1 1080p - 1800k (headroom)", Bitrate: "1800k", Codec: "AV1"}, {Label: "AV1 1080p - 1800k (headroom)", Bitrate: "1800k", Codec: "AV1"},
{Label: "H.265 1080p - 2000k (balanced)", Bitrate: "2000k", Codec: "H.265"}, {Label: "H.265 1080p - 2000k (balanced)", Bitrate: "2000k", Codec: "H.265"},
{Label: "H.265 1080p - 2400k (noisy sources)", Bitrate: "2400k", Codec: "H.265"}, {Label: "H.265 1080p - 2400k (noisy sources)", Bitrate: "2400k", Codec: "H.265"},
{Label: "AV1 1440p - 2600k (balanced)", Bitrate: "2600k", Codec: "AV1"},
{Label: "H.265 1440p - 3200k (balanced)", Bitrate: "3200k", Codec: "H.265"},
{Label: "H.265 1440p - 4000k (noisy sources)", Bitrate: "4000k", Codec: "H.265"},
{Label: "AV1 4K - 5M (balanced)", Bitrate: "5000k", Codec: "AV1"},
{Label: "H.265 4K - 6M (balanced)", Bitrate: "6000k", Codec: "H.265"},
{Label: "AV1 4K - 7M (archive)", Bitrate: "7000k", Codec: "AV1"}, {Label: "AV1 4K - 7M (archive)", Bitrate: "7000k", Codec: "AV1"},
{Label: "H.265 4K - 9M (fast/Topaz)", Bitrate: "9000k", Codec: "H.265"}, {Label: "H.265 4K - 9M (fast/Topaz)", Bitrate: "9000k", Codec: "H.265"},
} }
@ -6680,6 +6685,19 @@ func formatBitrate(bps int) string {
return fmt.Sprintf("%.0f kbps", kbps) return fmt.Sprintf("%.0f kbps", kbps)
} }
// formatBitrateFull shows both Mbps and kbps.
func formatBitrateFull(bps int) string {
if bps <= 0 {
return "N/A"
}
kbps := float64(bps) / 1000.0
mbps := kbps / 1000.0
if kbps >= 1000 {
return fmt.Sprintf("%.1f Mbps (%.0f kbps)", mbps, kbps)
}
return fmt.Sprintf("%.0f kbps (%.2f Mbps)", kbps, mbps)
}
// buildCompareView creates the UI for comparing two videos side by side // buildCompareView creates the UI for comparing two videos side by side
func buildCompareView(state *appState) fyne.CanvasObject { func buildCompareView(state *appState) fyne.CanvasObject {
compareColor := moduleColor("compare") compareColor := moduleColor("compare")
@ -6790,12 +6808,12 @@ func buildCompareView(state *appState) fyne.CanvasObject {
getField(state.compareFile2, func(s *videoSource) string { return fmt.Sprintf("%.2f fps", s.FrameRate) }))) getField(state.compareFile2, func(s *videoSource) string { return fmt.Sprintf("%.2f fps", s.FrameRate) })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n", comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Bitrate:", "Bitrate:",
getField(state.compareFile1, func(s *videoSource) string { return formatBitrate(s.Bitrate) }), getField(state.compareFile1, func(s *videoSource) string { return formatBitrateFull(s.Bitrate) }),
getField(state.compareFile2, func(s *videoSource) string { getField(state.compareFile2, func(s *videoSource) string {
if state.compareFile1 != nil { if state.compareFile1 != nil {
return utils.DeltaBitrate(s.Bitrate, state.compareFile1.Bitrate) return utils.DeltaBitrate(s.Bitrate, state.compareFile1.Bitrate)
} }
return formatBitrate(s.Bitrate) return formatBitrateFull(s.Bitrate)
}))) })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n", comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Pixel Format:", "Pixel Format:",
@ -6826,8 +6844,8 @@ func buildCompareView(state *appState) fyne.CanvasObject {
getField(state.compareFile2, func(s *videoSource) string { return s.AudioCodec }))) getField(state.compareFile2, func(s *videoSource) string { return s.AudioCodec })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n", comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Bitrate:", "Bitrate:",
getField(state.compareFile1, func(s *videoSource) string { return formatBitrate(s.AudioBitrate) }), getField(state.compareFile1, func(s *videoSource) string { return formatBitrateFull(s.AudioBitrate) }),
getField(state.compareFile2, func(s *videoSource) string { return formatBitrate(s.AudioBitrate) }))) getField(state.compareFile2, func(s *videoSource) string { return formatBitrateFull(s.AudioBitrate) })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n", comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Sample Rate:", "Sample Rate:",
getField(state.compareFile1, func(s *videoSource) string { return fmt.Sprintf("%d Hz", s.AudioRate) }), getField(state.compareFile1, func(s *videoSource) string { return fmt.Sprintf("%d Hz", s.AudioRate) }),
@ -6927,7 +6945,7 @@ func buildCompareView(state *appState) fyne.CanvasObject {
if refBitrate > 0 { if refBitrate > 0 {
bitrateStr = utils.DeltaBitrate(src.Bitrate, refBitrate) bitrateStr = utils.DeltaBitrate(src.Bitrate, refBitrate)
} else { } else {
bitrateStr = formatBitrate(src.Bitrate) bitrateStr = formatBitrateFull(src.Bitrate)
} }
} }
@ -7260,14 +7278,14 @@ func buildInspectView(state *appState) fyne.CanvasObject {
src.Width, src.Height, src.Width, src.Height,
src.AspectRatioString(), src.AspectRatioString(),
src.FrameRate, src.FrameRate,
formatBitrate(src.Bitrate), formatBitrateFull(src.Bitrate),
src.PixelFormat, src.PixelFormat,
src.ColorSpace, src.ColorSpace,
src.ColorRange, src.ColorRange,
src.FieldOrder, src.FieldOrder,
src.GOPSize, src.GOPSize,
src.AudioCodec, src.AudioCodec,
formatBitrate(src.AudioBitrate), formatBitrateFull(src.AudioBitrate),
src.AudioRate, src.AudioRate,
src.Channels, src.Channels,
src.DurationString(), src.DurationString(),

View File

@ -247,13 +247,7 @@ Some antivirus software may flag the built executable. This is common with Go ap
1. Add an exception for the build directory 1. Add an exception for the build directory
2. Submit the binary to your antivirus vendor for whitelisting 2. Submit the binary to your antivirus vendor for whitelisting
### macOS Support (Future)
macOS support is planned but not yet implemented. Required changes:
- Add macOS dependencies (via Homebrew)
- Add macOS build script
- Test Fyne on macOS
- Handle codesigning requirements - Handle codesigning requirements
## License ## License