VideoTools/docs/TRIM_MODULE_DESIGN.md
Stu Leak 5b8fc452af Add FPS counter, queue improvements, Compare fixes, and comprehensive documentation
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

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 07:35:48 -05:00

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 I or click button
  • Set Out Point (end of keep region) - Press O or 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 frame
  • Shift+← / Shift+→ - Jump 1 second
  • I - Set In Point at current position
  • O - Set Out Point at current position
  • Space - Play/Pause
  • C - 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 copy when no re-encoding needed
  • Only works at keyframe boundaries
  • Show warning if In/Out not at keyframes

Workflow

  1. Load Video - Drag video onto Trim tile or use Load button
  2. Navigate - Scrub or use keyboard to find start point
  3. Set In - Press I or click "Set In" button
  4. Find End - Navigate to end of region to keep
  5. Set Out - Press O or click "Set Out" button
  6. Preview - Click "Preview Trimmed" to see result
  7. 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)