From c872a3311e2b88e0cec570c4ff955713f6075d81 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Mon, 14 Jan 2013 16:23:38 +0000 Subject: [PATCH] timeshift: fix bug in relative seeking from live. --- src/timeshift/timeshift_reader.c | 34 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/timeshift/timeshift_reader.c b/src/timeshift/timeshift_reader.c index a8503c0c..d4099e76 100644 --- a/src/timeshift/timeshift_reader.c +++ b/src/timeshift/timeshift_reader.c @@ -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) {