Features: - FPS counter in conversion status showing real-time encoding speed - Job queue now displays FPS, encoding speed (e.g., "1.2x"), and ETA for running conversions - Copy Comparison button exports side-by-side metadata comparison report - Auto-compare checkbox in Convert module - automatically loads Compare view after conversion - Convert Now properly adds job to queue and displays in Job Queue with live stats - Module badge colors in job queue now match main menu tile colors - Fixed fullscreen compare window sizing (reduced player dimensions to prevent overflow) Bug Fixes: - Fixed queue state management - only one job runs at a time (prevents multiple jobs showing "running") - Fixed Compare module slot assignment - single video drops now fill empty slot instead of overwriting - Fixed job queue scroll rubber banding (no longer jumps back to top) - Enhanced crop detection validation for WMV/AVI formats with dimension clamping and bounds checking Documentation: - VT_Player integration notes with API requirements for keyframing and trim features - LosslessCut feature analysis for Trim module inspiration - Video metadata guide covering MP4/MKV custom fields and NFO generation - Trim module design specification - Compare fullscreen mode documentation - Updated VIDEO_PLAYER_FORK.md to mark fork as completed Technical Changes: - Added state tracking for FPS, speed, and ETA (main.go:197-199) - Enhanced queue processJobs() to check for running jobs before starting new ones - Improved Compare module drag-and-drop logic with smart slot assignment (both code paths) - Added deferred scroll position restoration to prevent UI jumping - Job queue Config map now carries conversion stats for display
6.3 KiB
6.3 KiB
Trim Module Design
Overview
The Trim module allows users to cut portions of video files using visual keyframe markers. Users can set In/Out points on the timeline and preview the trimmed segment before processing.
Core Features
1. Visual Timeline Editing
- Load video with VT_Player
- Set In Point (start of keep region) - Press
Ior click button - Set Out Point (end of keep region) - Press
Oor click button - Visual markers on timeline showing trim region
- Scrub through video to find exact frames
2. Keyframe Controls
[In Point] ←────────────────→ [Out Point]
0:10 Keep Region 2:45
═══════════════════════════════════════════
3. Frame-Accurate Navigation
←/→- Step backward/forward one frameShift+←/Shift+→- Jump 1 secondI- Set In Point at current positionO- Set Out Point at current positionSpace- Play/PauseC- Clear all keyframes
4. Multiple Trim Modes
Mode 1: Keep Region (Default)
Keep video between In and Out points, discard rest.
Input: [─────IN════════OUT─────]
Output: [════════]
Mode 2: Cut Region
Remove video between In and Out points, keep rest.
Input: [─────IN════════OUT─────]
Output: [─────] [─────]
Mode 3: Multiple Segments (Advanced)
Define multiple keep/cut regions using segment list.
UI Layout
┌─────────────────────────────────────────────┐
│ < TRIM │ ← Cyan header bar
├─────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────┐ │
│ │ Video Player (VT_Player) │ │
│ │ │ │
│ │ [Timeline with In/Out markers] │ │
│ │ ────I═══════════════O──────── │ │
│ │ │ │
│ │ [Play] [Pause] [In] [Out] [Clear] │ │
│ └───────────────────────────────────────┘ │
│ │
│ Trim Mode: ○ Keep Region ○ Cut Region │
│ │
│ In Point: 00:01:23.456 [Set In] [Clear] │
│ Out Point: 00:04:56.789 [Set Out] [Clear] │
│ Duration: 00:03:33.333 │
│ │
│ Output Settings: │
│ ┌─────────────────────────────────────┐ │
│ │ Format: [Same as source ▼] │ │
│ │ Re-encode: [ ] Smart copy (fast) │ │
│ │ Quality: [Source quality] │ │
│ └─────────────────────────────────────┘ │
│ │
│ [Preview Trimmed] [Add to Queue] │
│ │
└─────────────────────────────────────────────┘
← Cyan footer bar
VT_Player API Requirements
Required Methods
// Keyframe management
player.SetInPoint(position time.Duration)
player.SetOutPoint(position time.Duration)
player.GetInPoint() time.Duration
player.GetOutPoint() time.Duration
player.ClearKeyframes()
// Frame-accurate navigation
player.StepForward() // Advance one frame
player.StepBackward() // Go back one frame
player.GetCurrentTime() time.Duration
player.GetFrameRate() float64
// Visual feedback
player.ShowMarkers(in, out time.Duration) // Draw on timeline
Required Events
// Keyboard shortcuts
- OnKeyPress('I') -> Set In Point
- OnKeyPress('O') -> Set Out Point
- OnKeyPress('→') -> Step Forward
- OnKeyPress('←') -> Step Backward
- OnKeyPress('Space') -> Play/Pause
- OnKeyPress('C') -> Clear Keyframes
FFmpeg Integration
Keep Region Mode
ffmpeg -i input.mp4 -ss 00:01:23.456 -to 00:04:56.789 -c copy output.mp4
Cut Region Mode (Complex filter)
ffmpeg -i input.mp4 \
-filter_complex "[0:v]split[v1][v2]; \
[v1]trim=start=0:end=83.456[v1t]; \
[v2]trim=start=296.789[v2t]; \
[v1t][v2t]concat=n=2:v=1:a=0[outv]" \
-map [outv] output.mp4
Smart Copy (Fast)
- Use
-c copywhen no re-encoding needed - Only works at keyframe boundaries
- Show warning if In/Out not at keyframes
Workflow
- Load Video - Drag video onto Trim tile or use Load button
- Navigate - Scrub or use keyboard to find start point
- Set In - Press
Ior click "Set In" button - Find End - Navigate to end of region to keep
- Set Out - Press
Oor click "Set Out" button - Preview - Click "Preview Trimmed" to see result
- Queue - Click "Add to Queue" to process
Technical Notes
Precision Considerations
- Frame-accurate requires seeking to exact frame boundaries
- Display timestamps with millisecond precision (HH:MM:SS.mmm)
- VT_Player must handle fractional frame positions
- Consider GOP (Group of Pictures) boundaries for smart copy
Performance
- Preview shouldn't require full re-encode
- Show preview using VT_Player with constrained timeline
- Cache preview segments for quick playback testing
Future Enhancements
- Multiple trim regions in single operation
- Batch trim multiple files with same In/Out offsets
- Save trim presets (e.g., "Remove first 30s and last 10s")
- Visual waveform for audio-based trimming
- Chapter-aware trimming (trim to chapter boundaries)
Module Color
Cyan - #44DDFF (already defined in modulesList)