diff options
-rw-r--r-- | ffplay.c | 24 |
1 files changed, 10 insertions, 14 deletions
@@ -110,6 +110,7 @@ typedef struct VideoState { int seek_req; int seek_flags; int64_t seek_pos; + int64_t seek_rel; AVFormatContext *ic; int dtg_active_format; @@ -984,11 +985,11 @@ static double get_master_clock(VideoState *is) } /* seek in the stream */ -static void stream_seek(VideoState *is, int64_t pos, int rel) +static void stream_seek(VideoState *is, int64_t pos, int64_t rel) { if (!is->seek_req) { is->seek_pos = pos; - is->seek_flags = rel < 0 ? AVSEEK_FLAG_BACKWARD : 0; + is->seek_rel = rel; if (seek_by_bytes) is->seek_flags |= AVSEEK_FLAG_BYTE; is->seek_req = 1; @@ -1962,7 +1963,7 @@ static int decode_thread(void *arg) /* add the stream start time */ if (ic->start_time != AV_NOPTS_VALUE) timestamp += ic->start_time; - ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD); + ret = avformat_seek_file(ic, -1, INT64_MIN, timestamp, INT64_MAX, 0); if (ret < 0) { fprintf(stderr, "%s: could not seek to position %0.3f\n", is->filename, (double)timestamp / AV_TIME_BASE); @@ -2035,18 +2036,13 @@ static int decode_thread(void *arg) } #endif if (is->seek_req) { - int stream_index= -1; int64_t seek_target= is->seek_pos; + int64_t seek_min= is->seek_rel > 0 ? seek_target - is->seek_rel + 2: INT64_MIN; + int64_t seek_max= is->seek_rel < 0 ? seek_target - is->seek_rel - 2: INT64_MAX; +//FIXME the +-2 is due to rounding being not done in the correct direction in generation +// of the seek_pos/seek_rel variables - if (is-> video_stream >= 0) stream_index= is-> video_stream; - else if(is-> audio_stream >= 0) stream_index= is-> audio_stream; - else if(is->subtitle_stream >= 0) stream_index= is->subtitle_stream; - - if(stream_index>=0){ - seek_target= av_rescale_q(seek_target, AV_TIME_BASE_Q, ic->streams[stream_index]->time_base); - } - - ret = av_seek_frame(is->ic, stream_index, seek_target, is->seek_flags); + ret = avformat_seek_file(is->ic, -1, seek_min, seek_target, seek_max, is->seek_flags); if (ret < 0) { fprintf(stderr, "%s: error while seeking\n", is->ic->filename); }else{ @@ -2346,7 +2342,7 @@ static void event_loop(void) } else { pos = get_master_clock(cur_stream); pos += incr; - stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), incr); + stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE)); } } break; |