]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
timeshift: fix bug in relative seeking from live.
authorAdam Sutton <dev@adamsutton.me.uk>
Mon, 14 Jan 2013 16:23:38 +0000 (16:23 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Mon, 14 Jan 2013 16:34:37 +0000 (16:34 +0000)
src/timeshift/timeshift_reader.c

index a8503c0ca22d881fd7e20f337a8226d0022db89f..d4099e76c1faffbfbf4cdf3ff2ee4a0b92a693da 100644 (file)
@@ -470,32 +470,36 @@ void *timeshift_reader ( void *p )
               }
               /* -fallthrough */
             case SMT_SKIP_REL_TIME:
-              tvhlog(LOG_DEBUG, "timeshift", "ts %d skip %"PRId64" requested", ts->id, skip->time);
 
               /* Convert */
               skip_time =  ts_rescale(skip->time, 1000000);
-              skip_time += (skip->type == SMT_SKIP_ABS_TIME) ? ts->pts_delta : last_time;
+              tvhlog(LOG_DEBUG, "timeshift", "ts %d skip %"PRId64" requested", ts->id, skip->time);
 
-              /* Must handle live playback case */
+              /* Live playback (stage1) */
               if (ts->state == TS_LIVE) {
-                if (skip_time < now) {
-                  pthread_mutex_lock(&ts->rdwr_mutex);
-                  if ((cur_file   = timeshift_filemgr_get(ts, ts->ondemand))) {
-                    ts->state  = TS_PLAY;
-                    cur_off    = cur_file->size;
-                    last_time  = cur_file->last;
-                  } else {
-                    tvhlog(LOG_ERR, "timeshift", "ts %d failed to get current file", ts->id);
-                    skip = NULL;
-                  }
-                  pthread_mutex_unlock(&ts->rdwr_mutex);
+                pthread_mutex_lock(&ts->rdwr_mutex);
+                if ((cur_file   = timeshift_filemgr_get(ts, ts->ondemand))) {
+                  cur_off    = cur_file->size;
+                  last_time  = cur_file->last;
                 } else {
-                  tvhlog(LOG_DEBUG, "timeshift", "ts %d skip ignored, already live", ts->id);
+                  tvhlog(LOG_ERR, "timeshift", "ts %d failed to get current file", ts->id);
                   skip = NULL;
                 }
+                pthread_mutex_unlock(&ts->rdwr_mutex);
               }
 
               tvhlog(LOG_DEBUG, "timeshift", "ts %d skip last_time %"PRId64, ts->id, last_time);
+              skip_time += (skip->type == SMT_SKIP_ABS_TIME) ? ts->pts_delta : last_time;
+
+              /* Live (stage2) */
+              if (ts->state == TS_LIVE) {
+                if (skip_time >= now) {
+                  tvhlog(LOG_DEBUG, "timeshift", "ts %d skip ignored, already live", ts->id);
+                  skip = NULL;
+                } else {
+                  ts->state = TS_PLAY;
+                }
+              }
 
               /* OK */
               if (skip) {