@@ -68,8 +68,7 @@ enum class PlaybackRequest {
6868 NextFile,
6969 PrevFile,
7070 RestartFile,
71- SeekForward,
72- SeekBackward,
71+ Seek,
7372};
7473
7574struct marshal {
@@ -84,6 +83,7 @@ struct marshal {
8483 double current_drop_pct;
8584 PlaybackRequest request;
8685 double seek_delta;
86+ int64_t time_adjust_ns;
8787};
8888
8989static constexpr double kNcplayerSeekSeconds = 5.0 ;
@@ -128,6 +128,10 @@ auto perframe(struct ncvisual* ncv, struct ncvisual_options* vopts,
128128 struct timespec now;
129129 clock_gettime (CLOCK_MONOTONIC, &now);
130130 int64_t ns = timespec_to_ns (&now) - timespec_to_ns (start);
131+ ns += marsh->time_adjust_ns ;
132+ if (ns < 0 ){
133+ ns = 0 ;
134+ }
131135 marsh->blitter = vopts->blitter ;
132136 if (marsh->blitter == NCBLIT_DEFAULT){
133137 marsh->blitter = ncvisual_media_defblitter (nc, vopts->scaling );
@@ -247,23 +251,23 @@ auto perframe(struct ncvisual* ncv, struct ncvisual_options* vopts,
247251 marsh->show_fps = !marsh->show_fps ;
248252 continue ;
249253 }else if (keyp == NCKey::Up){
250- marsh->request = PlaybackRequest::SeekBackward ;
251- marsh->seek_delta = kNcplayerSeekMinutes ;
254+ marsh->request = PlaybackRequest::Seek ;
255+ marsh->seek_delta = - kNcplayerSeekMinutes ;
252256 ncplane_destroy (subp);
253257 return 2 ;
254258 }else if (keyp == NCKey::Down){
255- marsh->request = PlaybackRequest::SeekForward ;
259+ marsh->request = PlaybackRequest::Seek ;
256260 marsh->seek_delta = kNcplayerSeekMinutes ;
257261 ncplane_destroy (subp);
258262 return 2 ;
259263 }else if (keyp == NCKey::Right){
260- marsh->request = PlaybackRequest::SeekForward ;
264+ marsh->request = PlaybackRequest::Seek ;
261265 marsh->seek_delta = kNcplayerSeekSeconds ;
262266 ncplane_destroy (subp);
263267 return 2 ;
264268 }else if (keyp == NCKey::Left){
265- marsh->request = PlaybackRequest::SeekBackward ;
266- marsh->seek_delta = kNcplayerSeekSeconds ;
269+ marsh->request = PlaybackRequest::Seek ;
270+ marsh->seek_delta = - kNcplayerSeekSeconds ;
267271 ncplane_destroy (subp);
268272 return 2 ;
269273 }else if (keyp != ' q' ){
@@ -595,6 +599,7 @@ int rendered_mode_player_inner(NotCurses& nc, int argc, char** argv,
595599 ncplane_erase (n);
596600
597601 PlaybackRequest pending_request = PlaybackRequest::None;
602+ int64_t seek_time_offset_ns = 0 ;
598603 while (true ){
599604 bool restart_stream = false ;
600605 if (ffmpeg_has_audio (*ncv)){
@@ -623,7 +628,8 @@ int rendered_mode_player_inner(NotCurses& nc, int argc, char** argv,
623628 .current_fps = 0.0 ,
624629 .current_drop_pct = 0.0 ,
625630 .request = PlaybackRequest::None,
626- .seek_delta = kNcplayerSeekSeconds ,
631+ .seek_delta = 0.0 ,
632+ .time_adjust_ns = seek_time_offset_ns,
627633 };
628634 r = ncv->stream (&vopts, timescale, perframe, &marsh);
629635 pending_request = marsh.request ;
@@ -646,16 +652,11 @@ int rendered_mode_player_inner(NotCurses& nc, int argc, char** argv,
646652 free (stdn->get_userptr ());
647653 stdn->set_userptr (nullptr );
648654 restart_stream = false ;
649- if (pending_request == PlaybackRequest::SeekForward ||
650- pending_request == PlaybackRequest::SeekBackward){
655+ if (pending_request == PlaybackRequest::Seek){
651656 double delta = marsh.seek_delta ;
652- if (delta <= 0 ){
653- delta = kNcplayerSeekSeconds ;
654- }
655- if (pending_request == PlaybackRequest::SeekBackward){
656- delta = -delta;
657- }
658657 if (ncvisual_seek (*ncv, delta) == 0 ){
658+ int64_t delta_ns = (int64_t )(delta * (double )NANOSECS_IN_SEC);
659+ seek_time_offset_ns += delta_ns;
659660 pending_request = PlaybackRequest::None;
660661 restart_stream = true ;
661662 }else {
@@ -709,6 +710,7 @@ int rendered_mode_player_inner(NotCurses& nc, int argc, char** argv,
709710
710711 if (loop && pending_request == PlaybackRequest::None){
711712 restart_stream = true ;
713+ seek_time_offset_ns = 0 ;
712714 }
713715 }
714716
0 commit comments