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)
- 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)
- Cross-compilation from Linux: `bash scripts/build-windows.sh`
- Requires MinGW-w64 toolchain for cross-compilation
@ -366,15 +361,7 @@ bash scripts/build-windows.sh
# Output: dist/windows/VideoTools.exe
```
### macOS Cross-Compilation
```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
- ✅ Enhanced process management
#### macOS (Maintained)
- ✅ Continued support with Xcode tools
- ✅ Hardware acceleration (VideoToolbox)
#### Linux (Enhanced)
- ✅ Continued support with native builds
- ✅ Hardware acceleration (VAAPI, NVENC, QSV)
- ✅ Cross-platform compatibility
### 📊 Statistics
@ -128,7 +128,7 @@
- **New files**: 3 (platform.go, build-windows.sh, install.sh)
- **Updated files**: 15+ across codebase
- **Documentation**: 1,300+ lines added/updated
- **Platform support**: 3 platforms (Linux, macOS, Windows)
- **Platform support**: 2 platforms (Linux, Windows)
#### Features
- **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
- **Quality validation** with professional tools
- **Performance benchmarking** for encoding times
- **Cross-platform testing** (Windows, macOS, Linux)
- **Cross-platform testing** (Windows, Linux)
### Merge Module (Not Started)
- [ ] Design UI layout
@ -615,7 +615,7 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
### User Documentation
- [ ] Complete README.md for all modules
- [ ] Getting Started guide
- [ ] Installation instructions (Windows, macOS, Linux)
- [ ] Installation instructions (Windows, Linux)
- [ ] Keyboard shortcuts reference
- [ ] Workflow examples
- [ ] FAQ section
@ -634,7 +634,6 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
## Packaging & Distribution
- [ ] Create installers for Windows (.exe/.msi)
- [ ] Create macOS app bundle (.dmg)
- [ ] Create Linux packages (.deb, .rpm, AppImage)
- [ ] Set up CI/CD pipeline
- [ ] Automatic builds for releases
@ -658,7 +657,7 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
## Known Issues
- **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
## Fixed Issues (v0.1.0-dev11)

View File

@ -8,7 +8,7 @@
## 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**:
- **Windows**: NVENC (NVIDIA), QSV (Intel), AMF (AMD)
- **Linux**: VAAPI, NVENC, QSV
- **macOS**: VideoToolbox, NVENC
- **Platform-Specific Functions**:
- `ValidateWindowsPath()`: Validates drive letters and UNC paths
@ -170,16 +169,12 @@ var FFprobePath = "ffprobe"
- Hardware encoders: VAAPI, NVENC, QSV
- 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
### ✅ Completed
@ -315,7 +310,7 @@ The next phase requires:
2. Windows 10/11 system for testing
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:
- **Linux**: GNOME, KDE, XFCE, etc.
- **macOS**: Native macOS window behavior
- **Windows**: Native Windows window behavior
## 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 |
|---------|------------------|-------------|-----------|
| **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 |
| **Smart Chapters** | Manual | Auto-generation | Intelligent workflow |
| **Advanced Queue** | Basic | Enhanced | Better batch processing |
@ -147,7 +147,7 @@ type TitleInfo struct {
### **Technical Advantages**
- **Modern Codebase** - Go language for better maintainability and performance
- **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
- **AI Integration** - Next-generation enhancement capabilities
@ -170,7 +170,7 @@ type TitleInfo struct {
- ✅ **Complete Feature Set** - Comprehensive video processing capabilities
- ✅ **50% Faster Encoding** - Optimized hardware utilization
- ✅ **30% Better Quality** - Smart optimization algorithms
- ✅ **Cross-Platform** - Native Linux/macOS/Windows support
- ✅ **Cross-Platform** - Native Linux/Windows support
### **Market Positioning**
- **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
- ✅ **Metadata viewing and editing** - Basic implementation
- ✅ **Queue system** - Batch processing with job management
- ✅ **Cross-platform support** - Linux, macOS, Windows (dev14)
- ✅ **Cross-platform support** - Linux, Windows (dev14)
### 🔄 In Development/Planned
- 🔄 **Concatenation and merging** - Planned for dev15

View File

@ -551,7 +551,7 @@ type Controller interface {
- **Stub** (`controller_stub.go`): Returns errors for all operations
- **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.

View File

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

View File

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

View File

@ -94,8 +94,9 @@ func formatBitrateHuman(bps int) string {
return "--"
}
kbps := float64(bps) / 1000.0
mbps := kbps / 1000.0
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: "H.265 1080p - 2000k (balanced)", Bitrate: "2000k", 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: "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)
}
// 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
func buildCompareView(state *appState) fyne.CanvasObject {
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) })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"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 {
if state.compareFile1 != nil {
return utils.DeltaBitrate(s.Bitrate, state.compareFile1.Bitrate)
}
return formatBitrate(s.Bitrate)
return formatBitrateFull(s.Bitrate)
})))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Pixel Format:",
@ -6826,8 +6844,8 @@ func buildCompareView(state *appState) fyne.CanvasObject {
getField(state.compareFile2, func(s *videoSource) string { return s.AudioCodec })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Bitrate:",
getField(state.compareFile1, func(s *videoSource) string { return formatBitrate(s.AudioBitrate) }),
getField(state.compareFile2, 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 formatBitrateFull(s.AudioBitrate) })))
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
"Sample Rate:",
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 {
bitrateStr = utils.DeltaBitrate(src.Bitrate, refBitrate)
} else {
bitrateStr = formatBitrate(src.Bitrate)
bitrateStr = formatBitrateFull(src.Bitrate)
}
}
@ -7260,14 +7278,14 @@ func buildInspectView(state *appState) fyne.CanvasObject {
src.Width, src.Height,
src.AspectRatioString(),
src.FrameRate,
formatBitrate(src.Bitrate),
formatBitrateFull(src.Bitrate),
src.PixelFormat,
src.ColorSpace,
src.ColorRange,
src.FieldOrder,
src.GOPSize,
src.AudioCodec,
formatBitrate(src.AudioBitrate),
formatBitrateFull(src.AudioBitrate),
src.AudioRate,
src.Channels,
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
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
## License