diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-11-29 03:18:27 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-11-29 03:18:35 +0100 |
commit | 55a5ded67e0eabe4e81577feb92fb530cd618cf7 (patch) | |
tree | db77ccee57baa479c8a09312416706c300c58792 | |
parent | 1eb8809a4178b180045d920d45727328186103c5 (diff) | |
parent | f7eb50f3c0704a0d6e87dd218fc948b82a5e6329 (diff) | |
download | ffmpeg-55a5ded67e0eabe4e81577feb92fb530cd618cf7.tar.gz |
Merge remote-tracking branch 'cus/stable'
* cus/stable:
ffplay: increase maximum frame duration to 1 hour for streams without TS discontinuity
ffplay: fix updating external clock after seeking
ffplay: disallow seeking before the start of the file
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | ffplay.c | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -234,6 +234,7 @@ typedef struct VideoState { double video_current_pts; // current displayed pts (different from video_clock if frame fifos are used) double video_current_pts_drift; // video_current_pts - time (av_gettime) at which we updated video_current_pts - used to have running video pts int64_t video_current_pos; // current displayed file pos + double max_frame_duration; // maximum duration of a frame - above this, we consider the jump a timestamp discontinuity VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE]; int pictq_size, pictq_rindex, pictq_windex; SDL_mutex *pictq_mutex; @@ -1318,7 +1319,7 @@ retry: /* compute nominal last_duration */ last_duration = vp->pts - is->frame_last_pts; - if (last_duration > 0 && last_duration < 10.0) { + if (last_duration > 0 && last_duration < is->max_frame_duration) { /* if duration of the last frame was sane, update last_duration in video state */ is->frame_last_duration = last_duration; } @@ -2557,6 +2558,8 @@ static int read_thread(void *arg) if (seek_by_bytes < 0) seek_by_bytes = !!(ic->iformat->flags & AVFMT_TS_DISCONT); + is->max_frame_duration = (ic->iformat->flags & AVFMT_TS_DISCONT) ? 10.0 : 3600.0; + /* if seeking requested, we execute it */ if (start_time != AV_NOPTS_VALUE) { int64_t timestamp; @@ -2669,8 +2672,13 @@ static int read_thread(void *arg) packet_queue_flush(&is->videoq); packet_queue_put(&is->videoq, &flush_pkt); } + if (is->seek_flags & AVSEEK_FLAG_BYTE) { + //FIXME: use a cleaner way to signal obsolete external clock... + update_external_clock_pts(is, (double)AV_NOPTS_VALUE); + } else { + update_external_clock_pts(is, seek_target / (double)AV_TIME_BASE); + } } - update_external_clock_pts(is, (seek_target + ic->start_time) / (double)AV_TIME_BASE); is->seek_req = 0; eof = 0; } @@ -2984,6 +2992,8 @@ static void event_loop(VideoState *cur_stream) } else { pos = get_master_clock(cur_stream); pos += incr; + if (cur_stream->ic->start_time != AV_NOPTS_VALUE && pos < cur_stream->ic->start_time / (double)AV_TIME_BASE) + pos = cur_stream->ic->start_time / (double)AV_TIME_BASE; stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE), 0); } break; |