Compare commits
19 commits
71a282b828
...
815319b3f5
| Author | SHA1 | Date | |
|---|---|---|---|
| 815319b3f5 | |||
| 653e6721da | |||
| 4ce71fb894 | |||
| 77ad11eadf | |||
| 2d86fb2003 | |||
| d3ced0456a | |||
| 9a63c62deb | |||
| 0499cf7cb6 | |||
| 0c88169554 | |||
| 6990f18829 | |||
| 1e49fd2f05 | |||
| f3d70a0484 | |||
| 4efdc458a5 | |||
| 3d2e5e18a3 | |||
| b9cfc5b7c3 | |||
| f3392ff459 | |||
| ca6c303b56 | |||
| f620a5e9a2 | |||
| f496f73f96 |
6 changed files with 1501 additions and 172 deletions
63
DONE.md
63
DONE.md
|
|
@ -2,6 +2,69 @@
|
||||||
|
|
||||||
This file tracks completed features, fixes, and milestones.
|
This file tracks completed features, fixes, and milestones.
|
||||||
|
|
||||||
|
## Version 0.1.0-dev13 (In Progress - 2025-12-03)
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- ✅ **Automatic Black Bar Detection and Cropping**
|
||||||
|
- Detects and removes black bars to reduce file size (15-30% typical reduction)
|
||||||
|
- One-click "Detect Crop" button analyzes video using FFmpeg cropdetect
|
||||||
|
- Samples 10 seconds from middle of video for stable detection
|
||||||
|
- Shows estimated file size reduction percentage before applying
|
||||||
|
- User confirmation dialog displays before/after dimensions
|
||||||
|
- Manual crop override capability (width, height, X/Y offsets)
|
||||||
|
- Applied before scaling for optimal results
|
||||||
|
- Works in both direct convert and queue job execution
|
||||||
|
- Proper handling for videos without black bars
|
||||||
|
- 30-second timeout protection for detection process
|
||||||
|
|
||||||
|
- ✅ **Frame Rate Conversion UI with Size Estimates**
|
||||||
|
- Comprehensive frame rate options: Source, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60
|
||||||
|
- Intelligent file size reduction estimates (40-50% for 60→30 fps)
|
||||||
|
- Real-time hints showing "Converting X → Y fps: ~Z% smaller file"
|
||||||
|
- Warning for upscaling attempts with judder notice
|
||||||
|
- Automatic calculation based on source and target frame rates
|
||||||
|
- Dynamic updates when video or frame rate changes
|
||||||
|
- Supports both film (24 fps) and broadcast standards (25/29.97/30)
|
||||||
|
- Uses FFmpeg fps filter for frame rate conversion
|
||||||
|
|
||||||
|
- ✅ **Encoder Preset Descriptions with Speed/Quality Trade-offs**
|
||||||
|
- Detailed information for all 9 preset options
|
||||||
|
- Speed comparisons relative to "slow" and "medium" baselines
|
||||||
|
- File size impact percentages for each preset
|
||||||
|
- Visual icons indicating speed categories (⚡⏩⚖️🎯🐌)
|
||||||
|
- Recommends "slow" as best quality/size ratio
|
||||||
|
- Dynamic hint updates when preset changes
|
||||||
|
- Helps users make informed encoding time decisions
|
||||||
|
- Ranges from ultrafast (~10x faster, ~30% larger) to veryslow (~5x slower, ~15-20% smaller)
|
||||||
|
|
||||||
|
- ✅ **Compare Module**
|
||||||
|
- Side-by-side video comparison interface
|
||||||
|
- Load two videos and compare detailed metadata
|
||||||
|
- Displays format, resolution, codecs, bitrates, frame rate, pixel format
|
||||||
|
- Shows color space, color range, GOP size, field order
|
||||||
|
- Indicates presence of chapters and metadata
|
||||||
|
- Accessible via GUI button (pink color) or CLI: `videotools compare <file1> <file2>`
|
||||||
|
- Added formatBitrate() helper function for consistent bitrate display
|
||||||
|
|
||||||
|
- ✅ **Target File Size Encoding Mode**
|
||||||
|
- New "Target Size" bitrate mode in convert module
|
||||||
|
- Specify desired output file size (e.g., "25MB", "100MB", "8MB")
|
||||||
|
- Automatically calculates required video bitrate based on:
|
||||||
|
- Target file size
|
||||||
|
- Video duration
|
||||||
|
- Audio bitrate
|
||||||
|
- Container overhead (3% reserved)
|
||||||
|
- Implemented ParseFileSize() to parse size strings (KB, MB, GB)
|
||||||
|
- Implemented CalculateBitrateForTargetSize() for bitrate calculation
|
||||||
|
- Works in both GUI convert view and job queue execution
|
||||||
|
- Minimum bitrate sanity check (100 kbps) to prevent invalid outputs
|
||||||
|
|
||||||
|
### Technical Improvements
|
||||||
|
- ✅ Added compare command to CLI help text
|
||||||
|
- ✅ Consistent "Target Size" naming throughout UI and code
|
||||||
|
- ✅ Added compareFile1 and compareFile2 to appState for video comparison
|
||||||
|
- ✅ Module button grid updated with compare button (pink/magenta color)
|
||||||
|
|
||||||
## Version 0.1.0-dev12 (2025-12-02)
|
## Version 0.1.0-dev12 (2025-12-02)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
|
||||||
390
TESTING_DEV13.md
Normal file
390
TESTING_DEV13.md
Normal file
|
|
@ -0,0 +1,390 @@
|
||||||
|
# VideoTools v0.1.0-dev13 Testing Guide
|
||||||
|
|
||||||
|
This document provides a comprehensive testing checklist for all dev13 features.
|
||||||
|
|
||||||
|
## Build Status
|
||||||
|
- ✅ **Compiles successfully** with no errors
|
||||||
|
- ✅ **CLI help** displays correctly with compare command
|
||||||
|
- ✅ **All imports** resolved correctly (regexp added for cropdetect)
|
||||||
|
|
||||||
|
## Features to Test
|
||||||
|
|
||||||
|
### 1. Compare Module
|
||||||
|
|
||||||
|
**Test Steps:**
|
||||||
|
1. Launch VideoTools GUI
|
||||||
|
2. Click "Compare" module button (pink/magenta color)
|
||||||
|
3. Click "Load File 1" and select a video
|
||||||
|
4. Click "Load File 2" and select another video
|
||||||
|
5. Click "COMPARE" button
|
||||||
|
|
||||||
|
**Expected Results:**
|
||||||
|
- File 1 and File 2 metadata displayed side-by-side
|
||||||
|
- Shows: Format, Resolution, Duration, Codecs, Bitrates, Frame Rate
|
||||||
|
- Shows: Pixel Format, Aspect Ratio, Color Space, Color Range
|
||||||
|
- Shows: GOP Size, Field Order, Chapters, Metadata flags
|
||||||
|
- formatBitrate() displays bitrates in human-readable format (Mbps/kbps)
|
||||||
|
|
||||||
|
**CLI Test:**
|
||||||
|
```bash
|
||||||
|
./VideoTools compare video1.mp4 video2.mp4
|
||||||
|
```
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ buildCompareView() function implemented (main.go:4916)
|
||||||
|
- ✅ HandleCompare() handler registered (main.go:59)
|
||||||
|
- ✅ Module button added to grid with pink color (main.go:69)
|
||||||
|
- ✅ formatBitrate() helper function (main.go:4900)
|
||||||
|
- ✅ compareFile1/compareFile2 added to appState (main.go:197-198)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Target File Size Encoding Mode
|
||||||
|
|
||||||
|
**Test Steps:**
|
||||||
|
1. Load a video in Convert module
|
||||||
|
2. Switch to Advanced mode
|
||||||
|
3. Set Bitrate Mode to "Target Size"
|
||||||
|
4. Enter target size (e.g., "25MB", "100MB", "8MB")
|
||||||
|
5. Start conversion or add to queue
|
||||||
|
|
||||||
|
**Expected Results:**
|
||||||
|
- FFmpeg calculates video bitrate from: target size, duration, audio bitrate
|
||||||
|
- Reserves 3% for container overhead
|
||||||
|
- Minimum 100 kbps sanity check applied
|
||||||
|
- Works in both direct convert and queue jobs
|
||||||
|
|
||||||
|
**Test Cases:**
|
||||||
|
- Video: 1 minute, Target: 25MB, Audio: 192k → Video bitrate calculated
|
||||||
|
- Video: 5 minutes, Target: 100MB, Audio: 192k → Video bitrate calculated
|
||||||
|
- Very small target that would be impossible → Falls back to 100 kbps minimum
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ TargetFileSize field added to convertConfig (main.go:125)
|
||||||
|
- ✅ Target Size UI entry with placeholder (main.go:1931-1936)
|
||||||
|
- ✅ ParseFileSize() parses KB/MB/GB (internal/convert/types.go:205)
|
||||||
|
- ✅ CalculateBitrateForTargetSize() with overhead calc (internal/convert/types.go:173)
|
||||||
|
- ✅ Applied in startConvert() (main.go:3993)
|
||||||
|
- ✅ Applied in executeConvertJob() (main.go:1109)
|
||||||
|
- ✅ Passed to queue config (main.go:611)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Automatic Black Bar Detection & Cropping
|
||||||
|
|
||||||
|
**Test Steps:**
|
||||||
|
1. Load a video with black bars (letterbox/pillarbox)
|
||||||
|
2. Switch to Advanced mode
|
||||||
|
3. Scroll to AUTO-CROP section
|
||||||
|
4. Click "Detect Crop" button
|
||||||
|
5. Wait for detection (button shows "Detecting...")
|
||||||
|
6. Review detection dialog showing savings estimate
|
||||||
|
7. Click "Apply" to use detected values
|
||||||
|
8. Verify AutoCrop checkbox is checked
|
||||||
|
|
||||||
|
**Expected Results:**
|
||||||
|
- Samples 10 seconds from middle of video
|
||||||
|
- Uses FFmpeg cropdetect filter (threshold 24)
|
||||||
|
- Shows original vs cropped dimensions
|
||||||
|
- Calculates and displays pixel reduction percentage
|
||||||
|
- Applies crop values to config
|
||||||
|
- Works for both direct convert and queue jobs
|
||||||
|
|
||||||
|
**Test Cases:**
|
||||||
|
- Video with letterbox bars (top/bottom) → Detects and crops
|
||||||
|
- Video with pillarbox bars (left/right) → Detects and crops
|
||||||
|
- Video with no black bars → Shows "already fully cropped" message
|
||||||
|
- Very short video (<10 seconds) → Still attempts detection
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ detectCrop() function with 30s timeout (main.go:4841)
|
||||||
|
- ✅ CropValues struct (main.go:4832)
|
||||||
|
- ✅ Regex parsing: crop=(\d+):(\d+):(\d+):(\d+) (main.go:4870)
|
||||||
|
- ✅ AutoCrop checkbox in UI (main.go:1765)
|
||||||
|
- ✅ Detect Crop button with background execution (main.go:1771)
|
||||||
|
- ✅ Confirmation dialog with savings calculation (main.go:1797)
|
||||||
|
- ✅ Crop filter applied before scaling (main.go:3996)
|
||||||
|
- ✅ Works in queue jobs (main.go:1023)
|
||||||
|
- ✅ CropWidth/Height/X/Y fields added (main.go:136-139)
|
||||||
|
- ✅ Passed to queue config (main.go:621-625)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Frame Rate Conversion UI with Size Estimates
|
||||||
|
|
||||||
|
**Test Steps:**
|
||||||
|
1. Load a 60fps video in Convert module
|
||||||
|
2. Switch to Advanced mode
|
||||||
|
3. Find "Frame Rate" dropdown
|
||||||
|
4. Select "30" fps
|
||||||
|
5. Observe hint message below dropdown
|
||||||
|
|
||||||
|
**Expected Results:**
|
||||||
|
- Shows: "Converting 60 → 30 fps: ~50% smaller file"
|
||||||
|
- Hint updates dynamically when selection changes
|
||||||
|
- Warning shown for upscaling: "⚠ Upscaling from 30 to 60 fps (may cause judder)"
|
||||||
|
- No hint when "Source" selected or target equals source
|
||||||
|
|
||||||
|
**Test Cases:**
|
||||||
|
- 60fps → 30fps: Shows ~50% reduction
|
||||||
|
- 60fps → 24fps: Shows ~60% reduction
|
||||||
|
- 30fps → 60fps: Shows upscaling warning
|
||||||
|
- 30fps → 30fps: No hint (same as source)
|
||||||
|
- Video with unknown fps: No hint shown
|
||||||
|
|
||||||
|
**Frame Rate Options:**
|
||||||
|
- Source, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ All frame rate options added (main.go:2107)
|
||||||
|
- ✅ updateFrameRateHint() function (main.go:2051)
|
||||||
|
- ✅ Calculates reduction percentage (main.go:2094-2098)
|
||||||
|
- ✅ Upscaling warning (main.go:2099-2101)
|
||||||
|
- ✅ frameRateHint label in UI (main.go:2215)
|
||||||
|
- ✅ Updates on selection change (main.go:2110)
|
||||||
|
- ✅ FFmpeg fps filter already applied (main.go:4643-4646)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Encoder Preset Descriptions
|
||||||
|
|
||||||
|
**Test Steps:**
|
||||||
|
1. Load any video in Convert module
|
||||||
|
2. Switch to Advanced mode
|
||||||
|
3. Find "Encoder Preset" dropdown
|
||||||
|
4. Select different presets and observe hint
|
||||||
|
|
||||||
|
**Expected Results:**
|
||||||
|
- Each preset shows speed vs quality trade-off
|
||||||
|
- Visual icons: ⚡⏩⚖️🎯🐌
|
||||||
|
- Shows percentage differences vs baseline
|
||||||
|
- Recommends "slow" as best quality/size ratio
|
||||||
|
|
||||||
|
**Preset Information:**
|
||||||
|
- ultrafast: ⚡ ~10x faster than slow, ~30% larger
|
||||||
|
- superfast: ⚡ ~7x faster than slow, ~20% larger
|
||||||
|
- veryfast: ⚡ ~5x faster than slow, ~15% larger
|
||||||
|
- faster: ⏩ ~3x faster than slow, ~10% larger
|
||||||
|
- fast: ⏩ ~2x faster than slow, ~5% larger
|
||||||
|
- medium: ⚖️ Balanced (default baseline)
|
||||||
|
- slow: 🎯 Best ratio ~2x slower, ~5-10% smaller (RECOMMENDED)
|
||||||
|
- slower: 🎯 ~3x slower, ~10-15% smaller
|
||||||
|
- veryslow: 🐌 ~5x slower, ~15-20% smaller
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ updateEncoderPresetHint() function (main.go:2006)
|
||||||
|
- ✅ All 9 presets with descriptions (main.go:2009-2027)
|
||||||
|
- ✅ Visual icons for categories (main.go:2010, 2016, 2020, 2022, 2026)
|
||||||
|
- ✅ encoderPresetHint label in UI (main.go:2233)
|
||||||
|
- ✅ Updates on selection change (main.go:2036)
|
||||||
|
- ✅ Initialized with current preset (main.go:2039)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Integration Testing
|
||||||
|
|
||||||
|
### Queue System Integration
|
||||||
|
**All features must work when added to queue:**
|
||||||
|
- [ ] Compare module (N/A - not a conversion operation)
|
||||||
|
- [ ] Target File Size mode in queue job
|
||||||
|
- [ ] Auto-crop in queue job
|
||||||
|
- [ ] Frame rate conversion in queue job
|
||||||
|
- [ ] Encoder preset in queue job
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ All config fields passed to queue (main.go:599-634)
|
||||||
|
- ✅ executeConvertJob() handles all new fields
|
||||||
|
- ✅ Target Size: lines 1109-1133
|
||||||
|
- ✅ Auto-crop: lines 1023-1048
|
||||||
|
- ✅ Frame rate: line 1091-1094
|
||||||
|
- ✅ Encoder preset: already handled via encoderPreset field
|
||||||
|
|
||||||
|
### Settings Persistence
|
||||||
|
**Settings should persist across video loads:**
|
||||||
|
- [ ] Auto-crop checkbox state persists
|
||||||
|
- [ ] Frame rate selection persists
|
||||||
|
- [ ] Encoder preset selection persists
|
||||||
|
- [ ] Target file size value persists
|
||||||
|
|
||||||
|
**Code Verification:**
|
||||||
|
- ✅ All settings stored in state.convert
|
||||||
|
- ✅ Settings not reset when loading new video
|
||||||
|
- ✅ Reset button available to restore defaults (main.go:1823)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
1. **Auto-crop detection:**
|
||||||
|
- Samples only 10 seconds (may miss variable content)
|
||||||
|
- 30-second timeout for very slow systems
|
||||||
|
- Assumes black bars are consistent throughout video
|
||||||
|
|
||||||
|
2. **Frame rate conversion:**
|
||||||
|
- Estimates are approximate (actual savings depend on content)
|
||||||
|
- No motion interpolation (drops/duplicates frames only)
|
||||||
|
|
||||||
|
3. **Target file size:**
|
||||||
|
- Estimate based on single-pass encoding
|
||||||
|
- Container overhead assumed at 3%
|
||||||
|
- Actual file size may vary by ±5%
|
||||||
|
|
||||||
|
4. **Encoder presets:**
|
||||||
|
- Speed/size estimates are averages
|
||||||
|
- Actual performance depends on video complexity
|
||||||
|
- GPU acceleration may alter speed ratios
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Manual Testing Checklist
|
||||||
|
|
||||||
|
### Pre-Testing Setup
|
||||||
|
- [ ] Have test videos ready:
|
||||||
|
- [ ] 60fps video for frame rate testing
|
||||||
|
- [ ] Video with black bars for crop detection
|
||||||
|
- [ ] Short video (< 1 min) for quick testing
|
||||||
|
- [ ] Long video (> 5 min) for queue testing
|
||||||
|
|
||||||
|
### Compare Module
|
||||||
|
- [ ] Load two different videos
|
||||||
|
- [ ] Compare button shows both metadata
|
||||||
|
- [ ] Bitrates display correctly (Mbps/kbps)
|
||||||
|
- [ ] All fields populated correctly
|
||||||
|
- [ ] "Back to Menu" returns to main menu
|
||||||
|
|
||||||
|
### Target File Size
|
||||||
|
- [ ] Set target of 25MB on 1-minute video
|
||||||
|
- [ ] Verify conversion completes
|
||||||
|
- [ ] Check output file size (should be close to 25MB ±5%)
|
||||||
|
- [ ] Test with very small target (e.g., 1MB)
|
||||||
|
- [ ] Verify in queue job
|
||||||
|
|
||||||
|
### Auto-Crop
|
||||||
|
- [ ] Detect crop on letterbox video
|
||||||
|
- [ ] Verify savings percentage shown
|
||||||
|
- [ ] Apply detected values
|
||||||
|
- [ ] Convert with crop applied
|
||||||
|
- [ ] Compare output dimensions
|
||||||
|
- [ ] Test with no-black-bar video (should say "already fully cropped")
|
||||||
|
- [ ] Verify in queue job
|
||||||
|
|
||||||
|
### Frame Rate Conversion
|
||||||
|
- [ ] Load 60fps video
|
||||||
|
- [ ] Select 30fps
|
||||||
|
- [ ] Verify hint shows "~50% smaller"
|
||||||
|
- [ ] Select 60fps (same as source)
|
||||||
|
- [ ] Verify no hint shown
|
||||||
|
- [ ] Select 24fps
|
||||||
|
- [ ] Verify different percentage shown
|
||||||
|
- [ ] Try upscaling (30→60)
|
||||||
|
- [ ] Verify warning shown
|
||||||
|
|
||||||
|
### Encoder Presets
|
||||||
|
- [ ] Select "ultrafast" - verify hint shows
|
||||||
|
- [ ] Select "medium" - verify balanced description
|
||||||
|
- [ ] Select "slow" - verify recommendation shown
|
||||||
|
- [ ] Select "veryslow" - verify maximum compression note
|
||||||
|
- [ ] Test actual encoding with different presets
|
||||||
|
- [ ] Verify speed differences are noticeable
|
||||||
|
|
||||||
|
### Error Cases
|
||||||
|
- [ ] Auto-crop with no video loaded → Should show error dialog
|
||||||
|
- [ ] Very short video for crop detection → Should still attempt
|
||||||
|
- [ ] Invalid target file size (e.g., "abc") → Should handle gracefully
|
||||||
|
- [ ] Extremely small target size → Should apply 100kbps minimum
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Performance Testing
|
||||||
|
|
||||||
|
### Auto-Crop Detection Speed
|
||||||
|
- Expected: ~2-5 seconds for typical video
|
||||||
|
- Timeout: 30 seconds maximum
|
||||||
|
- [ ] Test on 1080p video
|
||||||
|
- [ ] Test on 4K video
|
||||||
|
- [ ] Test on very long video (should still sample 10s)
|
||||||
|
|
||||||
|
### Memory Usage
|
||||||
|
- [ ] Load multiple videos in compare mode
|
||||||
|
- [ ] Check memory doesn't leak
|
||||||
|
- [ ] Test with large (4K+) videos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regression Testing
|
||||||
|
|
||||||
|
Verify existing features still work:
|
||||||
|
- [ ] Basic video conversion works
|
||||||
|
- [ ] Queue add/remove/execute works
|
||||||
|
- [ ] Direct convert (not queued) works
|
||||||
|
- [ ] Simple mode still functional
|
||||||
|
- [ ] Advanced mode shows all controls
|
||||||
|
- [ ] Aspect ratio handling works
|
||||||
|
- [ ] Deinterlacing works
|
||||||
|
- [ ] Audio settings work
|
||||||
|
- [ ] Hardware acceleration detection works
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation Review
|
||||||
|
|
||||||
|
- ✅ DONE.md updated with all features
|
||||||
|
- ✅ TODO.md marked features as complete
|
||||||
|
- ✅ Commit messages are descriptive
|
||||||
|
- ✅ Code comments explain complex logic
|
||||||
|
- [ ] README.md updated (if needed)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Code Quality
|
||||||
|
|
||||||
|
### Code Review Completed:
|
||||||
|
- ✅ No compilation errors
|
||||||
|
- ✅ All imports resolved
|
||||||
|
- ✅ No obvious logic errors
|
||||||
|
- ✅ Error handling present (dialogs, nil checks)
|
||||||
|
- ✅ Logging added for debugging
|
||||||
|
- ✅ Function names are descriptive
|
||||||
|
- ✅ Code follows existing patterns
|
||||||
|
|
||||||
|
### Potential Issues to Watch:
|
||||||
|
- Crop detection regex assumes specific FFmpeg output format
|
||||||
|
- Frame rate hint calculations assume source FPS is accurate
|
||||||
|
- Target size calculation assumes consistent bitrate encoding
|
||||||
|
- 30-second timeout for crop detection might be too short on very slow systems
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sign-off
|
||||||
|
|
||||||
|
**Build Status:** ✅ PASSING
|
||||||
|
**Code Review:** ✅ COMPLETED
|
||||||
|
**Manual Testing:** ⏳ PENDING (requires video files)
|
||||||
|
**Documentation:** ✅ COMPLETED
|
||||||
|
|
||||||
|
**Ready for User Testing:** YES (with video files)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testing Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build
|
||||||
|
go build -o VideoTools
|
||||||
|
|
||||||
|
# CLI Help
|
||||||
|
./VideoTools help
|
||||||
|
|
||||||
|
# Compare (CLI)
|
||||||
|
./VideoTools compare video1.mp4 video2.mp4
|
||||||
|
|
||||||
|
# GUI
|
||||||
|
./VideoTools
|
||||||
|
|
||||||
|
# Debug mode
|
||||||
|
VIDEOTOOLS_DEBUG=1 ./VideoTools
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Last Updated: 2025-12-03
|
||||||
14
TODO.md
14
TODO.md
|
|
@ -5,21 +5,21 @@ This file tracks upcoming features, improvements, and known issues.
|
||||||
## Priority Features for dev13 (Based on Jake's research)
|
## Priority Features for dev13 (Based on Jake's research)
|
||||||
|
|
||||||
### Quality & Compression Improvements
|
### Quality & Compression Improvements
|
||||||
- [ ] **Automatic black bar detection and cropping** (HIGHEST PRIORITY)
|
- [x] **Automatic black bar detection and cropping** (v0.1.0-dev13 - COMPLETED)
|
||||||
- Implement ffmpeg cropdetect analysis pass
|
- Implement ffmpeg cropdetect analysis pass
|
||||||
- Auto-apply detected crop values
|
- Auto-apply detected crop values
|
||||||
- 15-30% file size reduction with zero quality loss
|
- 15-30% file size reduction with zero quality loss
|
||||||
- Add manual crop override option
|
- Add manual crop override option
|
||||||
|
|
||||||
- [ ] **Frame rate conversion UI**
|
- [x] **Frame rate conversion UI** (v0.1.0-dev13 - COMPLETED)
|
||||||
- Dropdown: Source, 24, 25, 29.97, 30, 50, 59.94, 60 fps
|
- Dropdown: Source, 23.976, 24, 25, 29.97, 30, 50, 59.94, 60 fps
|
||||||
- Auto-suggest 60→30fps conversion with size estimate
|
- Auto-suggest 60→30fps conversion with size estimate
|
||||||
- Show file size impact (40-45% reduction for 60→30)
|
- Show file size impact (40-50% reduction for 60→30)
|
||||||
|
|
||||||
- [ ] **HEVC/H.265 preset options**
|
- [x] **HEVC/H.265 encoder preset options** (v0.1.0-dev13 - COMPLETED)
|
||||||
- Add preset dropdown: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
|
- Preset dropdown: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
|
||||||
- Show time/quality trade-off estimates
|
- Show time/quality trade-off estimates
|
||||||
- Default to "slow" for best quality/size balance
|
- Recommend "slow" for best quality/size balance
|
||||||
|
|
||||||
- [ ] **Advanced filters module**
|
- [ ] **Advanced filters module**
|
||||||
- Denoising: hqdn3d (fast), nlmeans (slow, high quality)
|
- Denoising: hqdn3d (fast), nlmeans (slow, high quality)
|
||||||
|
|
|
||||||
109
docs/GNOME_COMPATIBILITY.md
Normal file
109
docs/GNOME_COMPATIBILITY.md
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
# GNOME/Linux Compatibility Notes
|
||||||
|
|
||||||
|
## Current Status
|
||||||
|
VideoTools is built with Fyne UI framework and runs on GNOME/Fedora and other Linux desktop environments.
|
||||||
|
|
||||||
|
## Known Issues
|
||||||
|
|
||||||
|
### Double-Click Titlebar to Maximize
|
||||||
|
**Issue**: Double-clicking the titlebar doesn't maximize the window like native GNOME apps.
|
||||||
|
|
||||||
|
**Cause**: This is a Fyne framework limitation. Fyne uses its own window rendering and doesn't fully implement all native window manager behaviors.
|
||||||
|
|
||||||
|
**Workarounds for Users**:
|
||||||
|
- Use GNOME's maximize button in titlebar
|
||||||
|
- Use keyboard shortcuts: `Super+Up` (GNOME default)
|
||||||
|
- Press `F11` for fullscreen (if app supports it)
|
||||||
|
- Right-click titlebar → Maximize
|
||||||
|
|
||||||
|
**Status**: Upstream Fyne issue. Monitor: https://github.com/fyne-io/fyne/issues
|
||||||
|
|
||||||
|
### Window Sizing
|
||||||
|
**Fixed**: Window now properly resizes and can be made smaller. Minimum sizes have been reduced to allow flexible layouts.
|
||||||
|
|
||||||
|
## Desktop Environment Testing
|
||||||
|
|
||||||
|
### Tested On
|
||||||
|
- ✅ GNOME (Fedora 43)
|
||||||
|
- ✅ X11 session
|
||||||
|
- ✅ Wayland session
|
||||||
|
|
||||||
|
### Should Work On (Untested)
|
||||||
|
- KDE Plasma
|
||||||
|
- XFCE
|
||||||
|
- Cinnamon
|
||||||
|
- MATE
|
||||||
|
- Other Linux DEs
|
||||||
|
|
||||||
|
## Cross-Platform Goals
|
||||||
|
|
||||||
|
VideoTools aims to run smoothly on:
|
||||||
|
- **Linux**: GNOME, KDE, XFCE, etc.
|
||||||
|
- **macOS**: Native macOS window behavior
|
||||||
|
- **Windows**: Native Windows window behavior
|
||||||
|
|
||||||
|
## Fyne Framework Considerations
|
||||||
|
|
||||||
|
### Advantages
|
||||||
|
- Cross-platform by default
|
||||||
|
- Single codebase for all OSes
|
||||||
|
- Modern Go-based development
|
||||||
|
- Good performance
|
||||||
|
|
||||||
|
### Limitations
|
||||||
|
- Some native behaviors may differ
|
||||||
|
- Window management is abstracted
|
||||||
|
- Custom titlebar rendering
|
||||||
|
- Some OS-specific shortcuts may not work
|
||||||
|
|
||||||
|
## Future Improvements
|
||||||
|
|
||||||
|
### Short Term
|
||||||
|
- [x] Flexible window sizing
|
||||||
|
- [x] Better minimum size handling
|
||||||
|
- [ ] Document all keyboard shortcuts
|
||||||
|
- [ ] Test on more Linux DEs
|
||||||
|
|
||||||
|
### Long Term
|
||||||
|
- [ ] Consider native window decorations option
|
||||||
|
- [ ] Investigate Fyne improvements for window management
|
||||||
|
- [ ] Add more GNOME-like keyboard shortcuts
|
||||||
|
- [ ] Better integration with system theme
|
||||||
|
|
||||||
|
## Recommendations for Users
|
||||||
|
|
||||||
|
### GNOME Users
|
||||||
|
- Use Super key shortcuts for window management
|
||||||
|
- Maximize: `Super+Up`
|
||||||
|
- Snap left/right: `Super+Left/Right`
|
||||||
|
- Fullscreen: `F11` (if supported)
|
||||||
|
- Close: `Alt+F4` or `Ctrl+Q`
|
||||||
|
|
||||||
|
### General Linux Users
|
||||||
|
- Most window management shortcuts work via your window manager
|
||||||
|
- VideoTools respects window manager tiling
|
||||||
|
- Window can be resized freely
|
||||||
|
- Multiple instances can run simultaneously
|
||||||
|
|
||||||
|
## Development Notes
|
||||||
|
|
||||||
|
When adding features:
|
||||||
|
- Test on both X11 and Wayland
|
||||||
|
- Verify window resizing behavior
|
||||||
|
- Check keyboard shortcuts don't conflict
|
||||||
|
- Consider both mouse and keyboard workflows
|
||||||
|
- Test with HiDPI displays
|
||||||
|
|
||||||
|
## Reporting Issues
|
||||||
|
|
||||||
|
If you encounter GNOME/Linux specific issues:
|
||||||
|
1. Note your distro and desktop environment
|
||||||
|
2. Specify X11 or Wayland
|
||||||
|
3. Include window manager if using tiling WM
|
||||||
|
4. Provide steps to reproduce
|
||||||
|
5. Check if issue exists on other platforms
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
- Fyne Documentation: https://developer.fyne.io/
|
||||||
|
- GNOME HIG: https://developer.gnome.org/hig/
|
||||||
|
- Linux Desktop Testing: Multiple VMs recommended
|
||||||
106
docs/VIDEO_PLAYER_FORK.md
Normal file
106
docs/VIDEO_PLAYER_FORK.md
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
# Video Player Fork Plan
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
The video player component will be extracted into a separate project to allow independent development and improvement of video playback controls while keeping VideoTools focused on video processing.
|
||||||
|
|
||||||
|
## Current Player Integration
|
||||||
|
The player is currently embedded in VideoTools at:
|
||||||
|
- `internal/player/` - Player implementation
|
||||||
|
- `main.go` - Player state and controls in Convert module
|
||||||
|
- Preview frame display
|
||||||
|
- Playback controls (play/pause, seek, volume)
|
||||||
|
|
||||||
|
## Fork Goals
|
||||||
|
|
||||||
|
### 1. Independent Development
|
||||||
|
- Develop player features without affecting VideoTools
|
||||||
|
- Faster iteration on playback controls
|
||||||
|
- Better testing of player-specific features
|
||||||
|
- Can be used by other projects
|
||||||
|
|
||||||
|
### 2. Improved Controls
|
||||||
|
Current limitations to address:
|
||||||
|
- Tighten up video controls
|
||||||
|
- Better seek bar with thumbnails on hover
|
||||||
|
- Improved timeline scrubbing
|
||||||
|
- Keyboard shortcuts for playback
|
||||||
|
- Frame-accurate stepping
|
||||||
|
- Playback speed controls
|
||||||
|
- Better volume control UI
|
||||||
|
|
||||||
|
### 3. Clean API
|
||||||
|
The forked player should expose a clean API:
|
||||||
|
```go
|
||||||
|
type Player interface {
|
||||||
|
Load(path string) error
|
||||||
|
Play()
|
||||||
|
Pause()
|
||||||
|
Seek(position time.Duration)
|
||||||
|
GetFrame(position time.Duration) (image.Image, error)
|
||||||
|
SetVolume(level float64)
|
||||||
|
Close()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Migration Strategy
|
||||||
|
|
||||||
|
### Phase 1: Extract to Separate Module
|
||||||
|
1. Create new repository: `github.com/yourusername/fyne-videoplayer`
|
||||||
|
2. Copy `internal/player/` to new repo
|
||||||
|
3. Extract player dependencies
|
||||||
|
4. Create clean API surface
|
||||||
|
5. Add comprehensive tests
|
||||||
|
|
||||||
|
### Phase 2: Update VideoTools
|
||||||
|
1. Import fyne-videoplayer as dependency
|
||||||
|
2. Replace internal/player with external package
|
||||||
|
3. Update player instantiation
|
||||||
|
4. Verify all playback features work
|
||||||
|
5. Remove old internal/player code
|
||||||
|
|
||||||
|
### Phase 3: Enhance Player (Post-Fork)
|
||||||
|
Features to add after fork:
|
||||||
|
- [ ] Thumbnail preview on seek bar hover
|
||||||
|
- [ ] Frame-accurate stepping (←/→ keys)
|
||||||
|
- [ ] Playback speed controls (0.25x to 2x)
|
||||||
|
- [ ] Improved volume slider
|
||||||
|
- [ ] Keyboard shortcuts (Space, K, J, L, etc.)
|
||||||
|
- [ ] Timeline markers
|
||||||
|
- [ ] Subtitle support
|
||||||
|
- [ ] Multi-audio track switching
|
||||||
|
|
||||||
|
## Technical Considerations
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
Current dependencies to maintain:
|
||||||
|
- Fyne for UI rendering
|
||||||
|
- FFmpeg for video decoding
|
||||||
|
- CGO for FFmpeg bindings
|
||||||
|
|
||||||
|
### Cross-Platform Support
|
||||||
|
Player must work on:
|
||||||
|
- Linux (GNOME, KDE, etc.)
|
||||||
|
- macOS
|
||||||
|
- Windows
|
||||||
|
|
||||||
|
### Performance
|
||||||
|
- Hardware acceleration where available
|
||||||
|
- Efficient frame buffering
|
||||||
|
- Low CPU usage during playback
|
||||||
|
- Fast seeking
|
||||||
|
|
||||||
|
## Timeline
|
||||||
|
1. **Week 1-2**: Extract player code, create repo, clean API
|
||||||
|
2. **Week 3**: Integration testing, update VideoTools
|
||||||
|
3. **Week 4+**: Enhanced controls and features
|
||||||
|
|
||||||
|
## Benefits
|
||||||
|
- **VideoTools**: Leaner codebase, focus on processing
|
||||||
|
- **Player**: Independent evolution, reusable component
|
||||||
|
- **Users**: Better video controls, more reliable playback
|
||||||
|
- **Developers**: Easier to contribute to either project
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
- Keep player dependency minimal in VideoTools
|
||||||
|
- Player should be optional - frame display can work without playback
|
||||||
|
- Consider using player in Compare module for side-by-side playback (future)
|
||||||
Loading…
Reference in a new issue