Commit Graph

533 Commits

Author SHA1 Message Date
VideoTools CI
12d29da20e Add optional dependency install controls in settings 2026-01-17 17:24:52 -05:00
VideoTools CI
75bce11be3 Fix missing function reference in Thumb-to-Thumbnail rename
- Update loadMultipleThumbVideos call to loadMultipleThumbnailVideos in main.go
- Resolves build error: s.loadMultipleThumbVideos undefined
- All Thumb-to-Thumbnail refactoring now complete and functional
2026-01-17 14:10:17 -05:00
VideoTools CI
c039ed2753 Rename Thumb module to Thumbnail throughout codebase
- Rename thumb_module.go to thumbnail_module.go and thumb_config.go to thumbnail_config.go
- Update all function names from showThumbView/addThumbSource/etc to showThumbnailView/addThumbnailSource/etc
- Update all struct fields from thumbFile/thumbFiles/etc to thumbnailFile/thumbnailFiles/etc
- Update config struct from thumbConfig to thumbnailConfig
- Update job type from JobTypeThumb to JobTypeThumbnail
- Update module registration from 'thumb' to 'thumbnail' in main.go
- Update UI components to show 'THUMBNAIL' instead of 'THUMB'
- Update handler function from HandleThumb to HandleThumbnail
- Update file naming patterns from 'thumb_*.jpg' to 'thumbnail_*.jpg'
- Update author module references to use Thumbnail naming
- Update documentation in QUEUE_SYSTEM_GUIDE.md
- Maintains all existing functionality while using clearer naming
2026-01-17 04:15:39 -05:00
c1c72fa417 Let Fyne size content after fullscreen 2026-01-16 16:08:52 -05:00
ed7a618a57 Avoid content size guard to fix fullscreen menu layout 2026-01-15 03:05:43 -05:00
f1cbfa66c0 Fix main menu sizing and add shell aliases 2026-01-15 02:58:55 -05:00
f3c1d3777e Enable subtitles drag-and-drop in module view 2026-01-11 06:48:18 -05:00
af0b29f1a4 Add playback stall watchdog and recovery 2026-01-11 05:44:21 -05:00
e0abdd6a33 Include git commit in version string 2026-01-10 16:47:45 -05:00
3fcaa9959b Coalesce player scrub seeks 2026-01-10 16:25:00 -05:00
426b9946b4 Open queue when clicking active history jobs 2026-01-10 05:12:36 -05:00
5c601f6714 Fix history dialog crash for in-progress jobs 2026-01-10 05:11:34 -05:00
d8dd3b804c Refresh frame after seek when paused 2026-01-10 04:45:43 -05:00
c12571368c Keep seek/step playback state consistent 2026-01-10 04:39:36 -05:00
e3d282623a Render frame immediately on step seek 2026-01-10 03:18:42 -05:00
b6790600c9 Improve GStreamer frame stepping reliability 2026-01-10 03:08:18 -05:00
4e1167c21d Clear player session on video reset 2026-01-10 02:46:10 -05:00
1a5e29c372 Scope history clear to active tab 2026-01-10 01:39:57 -05:00
2d76dc9d6b Keep history tab selection and add clear all 2026-01-10 01:36:17 -05:00
2e8c91abf8 Fix history sidebar titles and delete handling 2026-01-10 01:28:09 -05:00
12153de0ce 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).
2026-01-09 22:06:40 -05:00
e1fecbba06 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
2026-01-09 21:54:55 -05:00
b80dfdac9e 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!
2026-01-09 21:26:21 -05:00
6a604dbb35 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)
2026-01-09 19:22:08 -05:00
00df0b3b31 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.
2026-01-09 03:50:32 -05:00
bdc27c2253 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
a0bcdd55e2 Enforce display aspect ratio in conversions 2026-01-07 15:38:34 -05:00
e6c015e114 Add horizontal padding to snippet controls 2026-01-07 15:31:05 -05:00
2370868ca0 Enforce minimum window size via content guard 2026-01-07 15:19:43 -05:00
e7610256f2 Stabilize window minimums and player base size 2026-01-07 15:17:20 -05:00
306d581c69 Add static UI noise overlay 2026-01-07 15:02:28 -05:00
858c48cbb3 Refine Upscale layout and settings panel 2026-01-07 14:34:10 -05:00
d539af8d30 Keep player size stable without video 2026-01-07 14:12:02 -05:00
4127dea7c7 Clamp player layout aspect and size 2026-01-07 13:51:29 -05:00
0895e73873 Stabilize convert left column layout 2026-01-07 13:47:53 -05:00
e81cc27ea8 Restructure convert layout columns 2026-01-07 02:18:27 -05:00
282fbaaad8 Fix command preview drawer declaration 2026-01-07 02:12:07 -05:00
2df1f426a4 Move snippet/options previews into drawers 2026-01-07 02:11:15 -05:00
369d1e3f4f Give video pane dedicated transport bar 2026-01-07 02:06:20 -05:00
b1ddf81f4d Improve branding layout and fix GNOME icon 2026-01-07 01:59:16 -05:00
91c6ab73c7 Cap snippet options panel height 2026-01-06 23:50:15 -05:00
f42532a52d Guard two-pass in CRF mode 2026-01-06 22:10:04 -05:00
48817dcee3 Hide CRF auto row unless manual selected 2026-01-06 21:59:38 -05:00
4e53886fe3 Author menu sections and menu options 2026-01-06 21:31:17 -05:00
4e5c1cb33f Fix menu theme type and add openURL helper 2026-01-06 21:09:50 -05:00
c5efd222a9 Add DVD menu tab with theme and logo controls 2026-01-06 21:04:58 -05:00
1e50dc7e16 Refresh manual bitrate row visibility 2026-01-06 20:35:03 -05:00
fc8e4d51d5 Show CRF entry when bitrate mode is CRF 2026-01-06 20:30:34 -05:00
93d92ba97e Style convert sections with boxed layout 2026-01-06 19:42:38 -05:00
b7afb3a48e Increase color separation for formats and codecs 2026-01-06 18:48:57 -05:00