diff --git a/ffplay.c b/ffplay.c index eaabefd481..8a346867de 100644 --- a/ffplay.c +++ b/ffplay.c @@ -971,7 +971,7 @@ static double get_master_clock(VideoState *is) } /* seek in the stream */ -static void stream_seek(VideoState *is, int64_t pos, int64_t rel) +static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_bytes) { if (!is->seek_req) { is->seek_pos = pos; @@ -2319,11 +2319,11 @@ static void event_loop(void) else incr *= 180000.0; pos += incr; - stream_seek(cur_stream, pos, incr); + stream_seek(cur_stream, pos, incr, 1); } else { pos = get_master_clock(cur_stream); pos += incr; - stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE)); + stream_seek(cur_stream, (int64_t)(pos * AV_TIME_BASE), (int64_t)(incr * AV_TIME_BASE), 0); } } break; @@ -2333,6 +2333,10 @@ static void event_loop(void) break; case SDL_MOUSEBUTTONDOWN: if (cur_stream) { + if(seek_by_bytes || cur_stream->ic->duration<=0){ + uint64_t size= url_fsize(cur_stream->ic->pb); + stream_seek(cur_stream, size*(double)event.button.x/(double)cur_stream->width, 0, 1); + }else{ int64_t ts; int ns, hh, mm, ss; int tns, thh, tmm, tss; @@ -2350,7 +2354,8 @@ static void event_loop(void) ts = frac*cur_stream->ic->duration; if (cur_stream->ic->start_time != AV_NOPTS_VALUE) ts += cur_stream->ic->start_time; - stream_seek(cur_stream, ts, 0); + stream_seek(cur_stream, ts, 0, 0); + } } break; case SDL_VIDEORESIZE: