Render frame immediately on step seek

This commit is contained in:
Stu Leak 2026-01-10 03:18:42 -05:00
parent 407269b6c7
commit 2debc079fc

42
main.go
View File

@ -11356,13 +11356,17 @@ func (p *playSession) Seek(offset float64) {
// Positive delta moves forward, negative moves backward. // Positive delta moves forward, negative moves backward.
func (p *playSession) StepFrame(delta int) { func (p *playSession) StepFrame(delta int) {
p.mu.Lock() p.mu.Lock()
defer p.mu.Unlock()
if p.fps <= 0 { if p.fps <= 0 {
p.mu.Unlock()
return
}
gstPlayer := p.gstPlayer
if gstPlayer == nil {
p.mu.Unlock()
logging.Error(logging.CatPlayer, "playSession: GStreamer player not available")
return return
} }
// Use GStreamer player
if p.gstPlayer != nil {
currentFrame := int(p.current * p.fps) currentFrame := int(p.current * p.fps)
targetFrame := currentFrame + delta targetFrame := currentFrame + delta
@ -11376,22 +11380,36 @@ func (p *playSession) StepFrame(delta int) {
} }
// Seek to target frame // Seek to target frame
p.gstPlayer.SeekToFrame(int64(targetFrame)) _ = gstPlayer.SeekToFrame(int64(targetFrame))
p.current = float64(targetFrame) / p.fps p.current = float64(targetFrame) / p.fps
p.paused = true p.paused = true
p.frameN = targetFrame p.frameN = targetFrame
if p.frameFunc != nil { prog := p.prog
p.frameFunc(targetFrame) frameFunc := p.frameFunc
img := p.img
p.mu.Unlock()
if frameFunc != nil {
frameFunc(targetFrame)
} }
if p.prog != nil { if prog != nil {
p.prog(p.current) prog(p.current)
}
logging.Debug(logging.CatPlayer, "playSession: StepFrame delta=%d to frame %d", delta, targetFrame)
return
} }
logging.Error(logging.CatPlayer, "playSession: GStreamer player not available") frame, err := gstPlayer.GetFrameImage()
if err == nil && frame != nil {
fyne.CurrentApp().Driver().DoFromGoroutine(func() {
if img != nil {
img.Resource = nil
img.File = ""
img.Image = frame
img.Refresh()
}
}, false)
}
logging.Debug(logging.CatPlayer, "playSession: StepFrame delta=%d to frame %d", delta, targetFrame)
} }
// frameDisplayLoop continuously pulls frames from GStreamer and updates the UI // frameDisplayLoop continuously pulls frames from GStreamer and updates the UI