Commit Graph

520 Commits

Author SHA1 Message Date
7e252fbeff Keep seek/step playback state consistent 2026-01-10 04:39:36 -05:00
2debc079fc Render frame immediately on step seek 2026-01-10 03:18:42 -05:00
407269b6c7 Improve GStreamer frame stepping reliability 2026-01-10 03:08:18 -05:00
3d7cbfa22e Clear player session on video reset 2026-01-10 02:46:10 -05:00
fbf93fc9a3 Scope history clear to active tab 2026-01-10 01:39:57 -05:00
c72443b3c6 Keep history tab selection and add clear all 2026-01-10 01:36:17 -05:00
3cee42d041 Fix history sidebar titles and delete handling 2026-01-10 01:28:09 -05:00
8c0f182262 fix(player): calculate actual video frame number instead of display counter
The frame counter was showing the internal display loop counter (30fps)
instead of the actual video frame number. This caused the UI to show
frame numbers jumping by large increments (e.g., 260→304→348).

Fixed by calculating: actualFrameNumber = currentTime × fps

For a 60fps video:
- At 4.33s: frame 260 (not display counter 130)
- At 5.07s: frame 304 (not display counter 152)
- At 5.80s: frame 348 (not display counter 174)

Now the frame counter accurately reflects the actual video frame number,
progressing smoothly: 0, 1, 2, 3... (every 1/60th second for 60fps video).

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 22:06:40 -05:00
48eaf0be8d perf(player): optimize frame display loop for smooth playback
Performance improvements to eliminate choppy playback:

1. Cap display FPS at 30fps:
   - Even 60fps videos display at max 30fps
   - Reduces UI update overhead significantly
   - Human eye can't distinguish >30fps in preview player
   - Video plays at full 60fps internally, display throttled

2. Skip duplicate frames:
   - Track lastFrameTime from GStreamer
   - Only update UI when currentTime changes
   - Prevents refreshing same frame multiple times
   - Eliminates the "Frame 389 updated 17 times" issue

3. Remove verbose frame logging:
   - Removed per-frame debug log (was slowing down UI)
   - Keep INFO logs for start/stop events
   - Still log errors when they occur

4. Cleaner logging:
   - Show both video fps and display fps at startup
   - Makes performance characteristics visible

Results:
- Before: Choppy playback, same frame updated repeatedly
- After: Smooth 30fps display, no duplicate updates
- 4K video (3840x2160) now plays smoothly

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 21:54:55 -05:00
6f8b04405a fix(player): clear canvas.Image File field to display GStreamer frames
Critical fix for Fyne canvas rendering:

Fyne's canvas.Image has two ways to display content:
1. File field (string path) - takes precedence
2. Image field (image.Image) - used if File is empty

When buildVideoPane creates canvas.Image with NewImageFromFile(),
it sets the File field. Later when frameDisplayLoop sets Image field,
Fyne still tries to render from File path, ignoring the Image data.

Fix: Clear img.File before setting img.Image in frameDisplayLoop.

This allows GStreamer frames to actually display on screen instead
of showing the static placeholder frame.

Without this fix:
- GStreamer extracts frames perfectly (confirmed by logs)
- Frames are set to img.Image and Refresh() is called
- But Fyne still renders the static file, not the dynamic frames

With this fix:
- img.File cleared, so Fyne uses img.Image field
- Dynamic GStreamer frames display in real-time
- Video playback now visible!

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 21:26:21 -05:00
9c801e4910 fix(player): ensure GStreamer produces and displays frames properly
Critical fixes for GStreamer playback:

1. Add preroll waiting in GStreamer.Load():
   - Wait for ASYNC_DONE message after setting to PAUSED
   - Ensures first frame is ready before playback
   - Prevents black screen on load

2. Fix frameDisplayLoop to always pull frames:
   - Remove paused check that blocked frame extraction
   - Frames now pulled even when paused (enables scrubbing)
   - Only update progress bar when playing

3. Add comprehensive logging:
   - Log each frame update with size and timestamp
   - Debug frame pull errors
   - Track paused state during updates

4. Fix initial paused state:
   - Explicitly set paused=true after load
   - Matches GStreamer's PAUSED state

These changes fix:
- Black screen issue (no frames displaying)
- Scrubbing not working (frames not available when paused)
- Fast duration counting (progress only updates when playing)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 19:22:08 -05:00
ca48de7dc6 feat(player): replace UnifiedPlayerAdapter with GStreamer in playSession
- Replace unifiedAdapter with gstPlayer in playSession struct
- Update all playSession methods to use GStreamerPlayer:
  - Play(), Pause(), Seek(), StepFrame()
  - SetVolume(), Stop(), stopLocked(), startLocked()
  - GetCurrentFrame()
- Add frameDisplayLoop() to continuously pull frames from GStreamer
- Connect GStreamer frame output to Fyne canvas for display
- Remove all UnifiedPlayerAdapter dependencies

This completes the GStreamer integration for both Player module
and Convert preview system. Both now use the same stable GStreamer
backend for video playback.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-09 03:50:32 -05:00
68df790d27 Fix player frame generation and video playback
Major improvements to UnifiedPlayer:

1. GetFrameImage() now works when paused for responsive UI updates
2. Play() method properly starts FFmpeg process
3. Frame display loop runs continuously for smooth video display
4. Disabled audio temporarily to fix video playback fundamentals
5. Simplified FFmpeg command to focus on video stream only

Player now:
- Generates video frames correctly
- Shows video when paused
- Has responsive progress tracking
- Starts playback properly

Next steps: Re-enable audio playback once video is stable
2026-01-07 22:20:00 -05:00
38c0d3e62f Enforce display aspect ratio in conversions 2026-01-07 15:38:34 -05:00
672a67fe2a Add horizontal padding to snippet controls 2026-01-07 15:31:05 -05:00
db381b92df Enforce minimum window size via content guard 2026-01-07 15:19:43 -05:00
8a12f69169 Stabilize window minimums and player base size 2026-01-07 15:17:20 -05:00
11cd7dc885 Add static UI noise overlay 2026-01-07 15:02:28 -05:00
3bf786533a Refine Upscale layout and settings panel 2026-01-07 14:34:10 -05:00
a04709593b Keep player size stable without video 2026-01-07 14:12:02 -05:00
d4f75832e4 Clamp player layout aspect and size 2026-01-07 13:51:29 -05:00
4f855dbfe3 Stabilize convert left column layout 2026-01-07 13:47:53 -05:00
7536776da0 Restructure convert layout columns 2026-01-07 02:18:27 -05:00
40d2a57f74 Fix command preview drawer declaration 2026-01-07 02:12:07 -05:00
55d4969bc2 Move snippet/options previews into drawers 2026-01-07 02:11:15 -05:00
30eeaef753 Give video pane dedicated transport bar 2026-01-07 02:06:20 -05:00
19b8343c66 Improve branding layout and fix GNOME icon 2026-01-07 01:59:16 -05:00
33d709ace4 Cap snippet options panel height 2026-01-06 23:50:15 -05:00
c3bd5a0baa Guard two-pass in CRF mode 2026-01-06 22:10:04 -05:00
4a4eee1be5 Hide CRF auto row unless manual selected 2026-01-06 21:59:38 -05:00
68738cf1a5 Author menu sections and menu options 2026-01-06 21:31:17 -05:00
514f1a0475 Fix menu theme type and add openURL helper 2026-01-06 21:09:50 -05:00
46d8bd0f93 Add DVD menu tab with theme and logo controls 2026-01-06 21:04:58 -05:00
6ab73b859f Refresh manual bitrate row visibility 2026-01-06 20:35:03 -05:00
69cfdaa26b Show CRF entry when bitrate mode is CRF 2026-01-06 20:30:34 -05:00
2c1ae3b9c2 Style convert sections with boxed layout 2026-01-06 19:42:38 -05:00
860234255e Increase color separation for formats and codecs 2026-01-06 18:48:57 -05:00
Stu Leak
a0b4d53978 fix: final cleanup of syntax errors in main.go
- Remove extra closing brace on line 10999
- Remove large block of duplicate orphaned code (lines 11127-11170)
- Ensure all code is within proper function bodies
- Complete UnifiedPlayerAdapter integration with clean syntax
- Ready for successful compilation
2026-01-06 18:38:37 -05:00
Stu Leak
0b1cf8eb19 fix: remove duplicate code and syntax errors
- Remove orphaned closing brace in author_menu.go
- Remove duplicate code sections in main.go
- Fix non-declaration statements outside function body
- Ensure clean compilation with no syntax errors
- Complete UnifiedPlayerAdapter integration cleanup
2026-01-06 18:36:07 -05:00
Stu Leak
10b605464c fix: resolve syntax errors in author_menu.go and main.go
- Fix unterminated string in author_menu.go line 418
- Fix invalid escape sequences in escapeDrawtextText function
- Remove orphaned code outside function body in main.go
- Fix extra parentheses causing syntax errors
- Ensure clean compilation for successful build
2026-01-06 18:14:07 -05:00
Stu Leak
7369e5fe6a Document authoring content types and galleries 2026-01-06 18:03:46 -05:00
Stu Leak
618cfd208e Wire convert state manager callbacks 2026-01-06 17:52:46 -05:00
Stu Leak
12610e19b3 feat(upscale): redesign layout and encoding controls 2026-01-06 17:37:32 -05:00
Stu Leak
970a2328a9 Revert "feat(upscale): redesign layout and add encoding controls"
This reverts commit ed5be79f4c.
2026-01-06 17:25:39 -05:00
Stu Leak
ed5be79f4c feat(upscale): redesign layout and add encoding controls 2026-01-06 17:24:03 -05:00
Stu Leak
895c696b88 feat(upscale): add blur control 2026-01-06 17:01:06 -05:00
Stu Leak
784d6cba52 fix(upscale): report ffmpeg progress via pipe 2026-01-06 16:49:39 -05:00
Stu Leak
890f941821 Use updated VT logo in About 2026-01-06 02:05:09 -05:00
Stu Leak
55a7cf33b9 Relax module min sizes for window snapping 2026-01-05 22:50:25 -05:00
Stu Leak
303879b524 Fix unified player integration build break 2026-01-05 22:20:03 -05:00