Show bitrate in kbps/Mbps and expand presets
This commit is contained in:
parent
66e47c0b8a
commit
20a2fa7110
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
7
TODO.md
7
TODO.md
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,6 @@ Current dependencies to maintain:
|
|||
### Cross-Platform Support
|
||||
Player must work on:
|
||||
- Linux (GNOME, KDE, etc.)
|
||||
- macOS
|
||||
- Windows
|
||||
|
||||
### Performance
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
32
main.go
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user