diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 997756b539..239acf6e81 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -441,7 +441,7 @@ int ff_wav_init(void); /* raw.c */ int pcm_read_seek(AVFormatContext *s, - int stream_index, int64_t timestamp); + int stream_index, int64_t timestamp, int flags); int raw_init(void); /* mp3.c */ diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 156b255ec1..774d55f089 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -649,7 +649,7 @@ static int locate_frame_in_index(AVIIndexEntry *entries, return m; } -static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp) +static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { AVIContext *avi = s->priv_data; AVStream *st; diff --git a/libavformat/ffm.c b/libavformat/ffm.c index ce18d5fe9a..2867d11e0f 100644 --- a/libavformat/ffm.c +++ b/libavformat/ffm.c @@ -627,7 +627,7 @@ static int64_t get_pts(AVFormatContext *s, offset_t pos) /* seek to a given time in the file. The file read pointer is positionned at or before pts. XXX: the following code is quite approximative */ -static int ffm_seek(AVFormatContext *s, int64_t wanted_pts) +static int ffm_seek(AVFormatContext *s, int stream_index, int64_t wanted_pts, int flags) { FFMContext *ffm = s->priv_data; offset_t pos_min, pos_max, pos; @@ -662,7 +662,7 @@ static int ffm_seek(AVFormatContext *s, int64_t wanted_pts) pos_min = pos + FFM_PACKET_SIZE; } } - pos = pos_min; + pos = (flags & AVSEEK_FLAG_BACKWARD) ? pos_min : pos_max; if (pos > 0) pos -= FFM_PACKET_SIZE; found: diff --git a/libavformat/mov.c b/libavformat/mov.c index e82e2f109c..b0f4b8bf6b 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1846,7 +1846,7 @@ readchunk: /** * Seek method based on the one described in the Appendix C of QTFileFormat.pdf */ -static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp) +static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags) { MOVContext* mov = (MOVContext *) s->priv_data; MOVStreamContext* sc; diff --git a/libavformat/raw.c b/libavformat/raw.c index dadc495766..23ba5006be 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -126,7 +126,7 @@ static int raw_read_close(AVFormatContext *s) } int pcm_read_seek(AVFormatContext *s, - int stream_index, int64_t timestamp) + int stream_index, int64_t timestamp, int flags) { AVStream *st; int block_align, byte_rate; @@ -158,8 +158,11 @@ int pcm_read_seek(AVFormatContext *s, return -1; /* compute the position by aligning it to block_align */ - pos = av_rescale(timestamp * byte_rate, st->time_base.num, st->time_base.den); - pos = (pos / block_align) * block_align; + pos = av_rescale_rnd(timestamp * byte_rate, + st->time_base.num, + st->time_base.den * (int64_t)block_align, + (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP); + pos *= block_align; /* recompute exact position */ st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num); diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 6037f9035e..af898ba217 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1111,7 +1111,7 @@ static int rtsp_read_pause(AVFormatContext *s) } static int rtsp_read_seek(AVFormatContext *s, int stream_index, - int64_t timestamp) + int64_t timestamp, int flags) { RTSPState *rt = s->priv_data; diff --git a/libavformat/wav.c b/libavformat/wav.c index 841e153ceb..0bc3c3408b 100644 --- a/libavformat/wav.c +++ b/libavformat/wav.c @@ -344,7 +344,7 @@ static int wav_read_close(AVFormatContext *s) } static int wav_read_seek(AVFormatContext *s, - int stream_index, int64_t timestamp) + int stream_index, int64_t timestamp, int flags) { AVStream *st; @@ -359,7 +359,7 @@ static int wav_read_seek(AVFormatContext *s, default: break; } - return pcm_read_seek(s, stream_index, timestamp); + return pcm_read_seek(s, stream_index, timestamp, flags); }