Index: libs/libmythtv/avformatdecoder.cpp =================================================================== --- libs/libmythtv/avformatdecoder.cpp (revision 22272) +++ libs/libmythtv/avformatdecoder.cpp (working copy) @@ -606,9 +606,13 @@ if (CODEC_IS_MPEG(context->codec_id)) frameseekadjust = maxkeyframedist+1; + long long startts = av_rescale(ic->start_time, + (int64_t)AV_TIME_BASE * (int64_t)st->time_base.num, + st->time_base.den); + // convert framenumber to normalized timestamp long double diff = (max(desiredFrame - frameseekadjust, 0LL)) * AV_TIME_BASE; - long long ts = (long long)( diff / fps ); + long long ts = startts + (long long)( diff / fps ); if (av_seek_frame(ic, -1, ts, AVSEEK_FLAG_BACKWARD) < 0) { VERBOSE(VB_IMPORTANT, LOC_ERR @@ -620,8 +624,8 @@ // libav sometimes returns the end of the stream instead. if (desiredFrame <= 1) { - av_update_cur_dts(ic, st, 0); - ic->start_time = 0; + av_seek_frame(ic, -1, 0, AVSEEK_FLAG_BACKWARD); + ic->start_time = st->cur_dts; } int normalframes = 0; @@ -633,11 +637,7 @@ if (ic->start_time != (int64_t)AV_NOPTS_VALUE) { - int64_t st1 = av_rescale(ic->start_time, - st->time_base.den, - AV_TIME_BASE * (int64_t)st->time_base.num); - adj_cur_dts = lsb3full(adj_cur_dts, st1, st->pts_wrap_bits); - + adj_cur_dts = lsb3full(adj_cur_dts, ic->start_time, st->pts_wrap_bits); } long long newts = av_rescale(adj_cur_dts, @@ -1178,6 +1178,10 @@ if (ringBuffer->isDVD()) directrendering = false; + av_seek_frame(ic, -1, 0, AVSEEK_FLAG_BACKWARD); + ic->start_time = stream->cur_dts; + VERBOSE(VB_PLAYBACK, LOC + "Setting context start_time to " << ic->start_time); + if (selectedStream) { fps = normalized_fps(stream, enc);