diff --git a/BUILD_AND_RUN.md b/BUILD_AND_RUN.md index 9af42e8..d65dfb4 100644 --- a/BUILD_AND_RUN.md +++ b/BUILD_AND_RUN.md @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d1a67b..67a1c1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/TODO.md b/TODO.md index c1186df..9176337 100644 --- a/TODO.md +++ b/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) diff --git a/docs/DEV14_WINDOWS_IMPLEMENTATION.md b/docs/DEV14_WINDOWS_IMPLEMENTATION.md index 1b1db99..b9282ff 100644 --- a/docs/DEV14_WINDOWS_IMPLEMENTATION.md +++ b/docs/DEV14_WINDOWS_IMPLEMENTATION.md @@ -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. --- diff --git a/docs/GNOME_COMPATIBILITY.md b/docs/GNOME_COMPATIBILITY.md index c47ce75..f054fa7 100644 --- a/docs/GNOME_COMPATIBILITY.md +++ b/docs/GNOME_COMPATIBILITY.md @@ -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 diff --git a/docs/HANDBRAKE_REPLACEMENT.md b/docs/HANDBRAKE_REPLACEMENT.md index 16c4b7f..4bbdf4e 100644 --- a/docs/HANDBRAKE_REPLACEMENT.md +++ b/docs/HANDBRAKE_REPLACEMENT.md @@ -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 diff --git a/docs/MODULES.md b/docs/MODULES.md index 46c6223..eea067a 100644 --- a/docs/MODULES.md +++ b/docs/MODULES.md @@ -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 diff --git a/docs/VIDEO_PLAYER.md b/docs/VIDEO_PLAYER.md index 22f284d..5a262fc 100644 --- a/docs/VIDEO_PLAYER.md +++ b/docs/VIDEO_PLAYER.md @@ -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. diff --git a/docs/VIDEO_PLAYER_FORK.md b/docs/VIDEO_PLAYER_FORK.md index 529ad32..6cb319c 100644 --- a/docs/VIDEO_PLAYER_FORK.md +++ b/docs/VIDEO_PLAYER_FORK.md @@ -93,7 +93,6 @@ Current dependencies to maintain: ### Cross-Platform Support Player must work on: - Linux (GNOME, KDE, etc.) -- macOS - Windows ### Performance diff --git a/docs/VT_PLAYER_INTEGRATION_NOTES.md b/docs/VT_PLAYER_INTEGRATION_NOTES.md index 31ed102..0cf4b79 100644 --- a/docs/VT_PLAYER_INTEGRATION_NOTES.md +++ b/docs/VT_PLAYER_INTEGRATION_NOTES.md @@ -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 diff --git a/docs/convert/README.md b/docs/convert/README.md index d68ea5a..5b67826 100644 --- a/docs/convert/README.md +++ b/docs/convert/README.md @@ -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 diff --git a/internal/utils/formatting.go b/internal/utils/formatting.go index a67620d..35c9888 100644 --- a/internal/utils/formatting.go +++ b/internal/utils/formatting.go @@ -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) } diff --git a/main.go b/main.go index 42e391b..9ad547c 100644 --- a/main.go +++ b/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(), diff --git a/scripts/README.md b/scripts/README.md index 264572c..4ed480e 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -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