diff mbox series

[FFmpeg-devel] lavf/dv: do not set video timebase more than once

Message ID 20230427113911.15352-1-anton@khirnov.net
State Accepted
Commit c7a852b638b88f129790af31fc47c870c329eaaa
Headers show
Series [FFmpeg-devel] lavf/dv: do not set video timebase more than once | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov April 27, 2023, 11:39 a.m. UTC
Current code will call avpriv_set_pts_info() for each video frame,
possibly setting a different timebase if the stream framerate changes.
This violates API conventions, as the timebase is supposed to stay
constant after stream creation.

Change the demuxer to set a single timebase that is fine enough to
handle all supported DV framerates.

The seek tests change slightly because the new timebase is more
granular.
---
 libavcodec/dv.h                   |  3 +++
 libavformat/avidec.c              | 22 +++++++++++++------
 libavformat/dv.c                  | 36 +++++++++++++++++++++++--------
 libavformat/dv.h                  |  2 +-
 tests/ref/seek/lavf-dv            | 16 +++++++-------
 tests/ref/seek/vsynth_lena-dv     | 24 ++++++++++-----------
 tests/ref/seek/vsynth_lena-dv-411 | 24 ++++++++++-----------
 tests/ref/seek/vsynth_lena-dv-50  | 24 ++++++++++-----------
 8 files changed, 91 insertions(+), 60 deletions(-)

Comments

Anton Khirnov May 1, 2023, 9:52 a.m. UTC | #1
Will push the set tomorrow if nobody has further objections.
diff mbox series

Patch

diff --git a/libavcodec/dv.h b/libavcodec/dv.h
index 29f97b6089..b473bdc992 100644
--- a/libavcodec/dv.h
+++ b/libavcodec/dv.h
@@ -60,6 +60,9 @@  enum DVPackType {
  */
 #define DV_MAX_FRAME_SIZE 576000
 
+// LCM of video framerate numerators
+#define DV_TIMESCALE_VIDEO 60000
+
 /**
  * maximum number of blocks per macroblock in any DV format
  */
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 7a3fad6392..00bd7a98a9 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -1869,13 +1869,20 @@  static int avi_read_seek(AVFormatContext *s, int stream_index,
     st    = s->streams[stream_index];
     sti   = ffstream(st);
     ast   = st->priv_data;
-    index = av_index_search_timestamp(st,
-                                      timestamp * FFMAX(ast->sample_size, 1),
-                                      flags);
+
+    if (avi->dv_demux) {
+        // index entries are in the AVI scale/rate timebase, which does
+        // not match DV demuxer's stream timebase
+        timestamp = av_rescale_q(timestamp, st->time_base,
+                                 (AVRational){ ast->scale, ast->rate });
+    } else
+        timestamp *= FFMAX(ast->sample_size, 1);
+
+    index = av_index_search_timestamp(st, timestamp, flags);
     if (index < 0) {
         if (sti->nb_index_entries > 0)
             av_log(s, AV_LOG_DEBUG, "Failed to find timestamp %"PRId64 " in index %"PRId64 " .. %"PRId64 "\n",
-                   timestamp * FFMAX(ast->sample_size, 1),
+                   timestamp,
                    sti->index_entries[0].timestamp,
                    sti->index_entries[sti->nb_index_entries - 1].timestamp);
         return AVERROR_INVALIDDATA;
@@ -1883,7 +1890,7 @@  static int avi_read_seek(AVFormatContext *s, int stream_index,
 
     /* find the position */
     pos       = sti->index_entries[index].pos;
-    timestamp = sti->index_entries[index].timestamp / FFMAX(ast->sample_size, 1);
+    timestamp = sti->index_entries[index].timestamp;
 
     av_log(s, AV_LOG_TRACE, "XX %"PRId64" %d %"PRId64"\n",
             timestamp, index, sti->index_entries[index].timestamp);
@@ -1898,11 +1905,14 @@  static int avi_read_seek(AVFormatContext *s, int stream_index,
 
         /* Feed the DV video stream version of the timestamp to the */
         /* DV demux so it can synthesize correct timestamps.        */
-        ff_dv_offset_reset(avi->dv_demux, timestamp);
+        ff_dv_ts_reset(avi->dv_demux,
+                           av_rescale_q(timestamp, (AVRational){ ast->scale, ast->rate },
+                                        st->time_base));
 
         avi->stream_index = -1;
         return 0;
     }
+    timestamp /= FFMAX(ast->sample_size, 1);
 
     pos_min = pos;
     for (i = 0; i < s->nb_streams; i++) {
diff --git a/libavformat/dv.c b/libavformat/dv.c
index ffed1a7a90..9888c10b48 100644
--- a/libavformat/dv.c
+++ b/libavformat/dv.c
@@ -69,6 +69,8 @@  struct DVDemuxContext {
     uint8_t           audio_buf[4][8192];
     int               ach;
     int               frames;
+
+    int64_t           next_pts_video;
 };
 
 static inline uint16_t dv_audio_12to16(uint16_t sample)
@@ -314,8 +316,6 @@  static int dv_extract_video_info(DVDemuxContext *c, const uint8_t *frame)
 
     par = c->vst->codecpar;
 
-    avpriv_set_pts_info(c->vst, 64, c->sys->time_base.num,
-                        c->sys->time_base.den);
     c->vst->avg_frame_rate = av_inv_q(c->vst->time_base);
 
     /* finding out SAR is a little bit messy */
@@ -360,6 +360,8 @@  static int dv_init_demux(AVFormatContext *s, DVDemuxContext *c)
     c->vst->codecpar->bit_rate   = 25000000;
     c->vst->start_time        = 0;
 
+    avpriv_set_pts_info(c->vst, 64, 1, DV_TIMESCALE_VIDEO);
+
     /* Audio streams are added later as they are encountered. */
     s->ctx_flags |= AVFMTCTX_NOHEADER;
 
@@ -463,7 +465,10 @@  int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
         pkt->size         = size;
         pkt->flags       |= AV_PKT_FLAG_KEY;
         pkt->stream_index = c->vst->index;
-        pkt->pts          = c->frames;
+        pkt->pts          = c->next_pts_video;
+        pkt->duration     = av_rescale_q(1, c->sys->time_base, c->vst->time_base);
+
+        c->next_pts_video += pkt->duration;
     }
 
     c->frames++;
@@ -472,28 +477,34 @@  int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
 }
 
 static int64_t dv_frame_offset(AVFormatContext *s, DVDemuxContext *c,
-                               int64_t timestamp, int flags)
+                               int64_t *timestamp)
 {
     // FIXME: sys may be wrong if last dv_read_packet() failed (buffer is junk)
     FFFormatContext *const si = ffformatcontext(s);
     const int frame_size = c->sys->frame_size;
+    int64_t  frame_count = av_rescale_q(*timestamp, c->vst->time_base, c->sys->time_base);
     int64_t offset;
     int64_t size       = avio_size(s->pb) - si->data_offset;
     int64_t max_offset = ((size - 1) / frame_size) * frame_size;
 
-    offset = frame_size * timestamp;
+    offset = frame_size * frame_count;
 
     if (size >= 0 && offset > max_offset)
         offset = max_offset;
     else if (offset < 0)
         offset = 0;
 
+    *timestamp = av_rescale_q(offset / frame_size, c->sys->time_base, c->vst->time_base);
+
     return offset + si->data_offset;
 }
 
-void ff_dv_offset_reset(DVDemuxContext *c, int64_t frame_offset)
+void ff_dv_ts_reset(DVDemuxContext *c, int64_t ts)
 {
-    c->frames = frame_offset;
+    c->frames         = !c->sys ? 0 :
+                        av_rescale_q(ts, c->vst->time_base, c->sys->time_base);
+    c->next_pts_video = ts;
+
     c->audio_pkt[0].size = c->audio_pkt[1].size = 0;
     c->audio_pkt[2].size = c->audio_pkt[3].size = 0;
 }
@@ -618,12 +629,19 @@  static int dv_read_seek(AVFormatContext *s, int stream_index,
 {
     RawDVContext *r   = s->priv_data;
     DVDemuxContext *c = &r->dv_demux;
-    int64_t offset    = dv_frame_offset(s, c, timestamp, flags);
+    int64_t offset;
+
+    // seek using the video stream
+    if (stream_index != c->vst->index)
+        timestamp = av_rescale_q(timestamp, s->streams[stream_index]->time_base,
+                                 c->vst->time_base);
+
+    offset = dv_frame_offset(s, c, &timestamp);
 
     if (avio_seek(s->pb, offset, SEEK_SET) < 0)
         return -1;
 
-    ff_dv_offset_reset(c, offset / c->sys->frame_size);
+    ff_dv_ts_reset(c, timestamp);
     return 0;
 }
 
diff --git a/libavformat/dv.h b/libavformat/dv.h
index efced6ccf0..d21ea19e02 100644
--- a/libavformat/dv.h
+++ b/libavformat/dv.h
@@ -34,6 +34,6 @@  typedef struct DVDemuxContext DVDemuxContext;
 DVDemuxContext* avpriv_dv_init_demux(AVFormatContext* s);
 int avpriv_dv_get_packet(DVDemuxContext*, AVPacket *);
 int avpriv_dv_produce_packet(DVDemuxContext*, AVPacket*, uint8_t*, int, int64_t);
-void ff_dv_offset_reset(DVDemuxContext *c, int64_t frame_offset);
+void ff_dv_ts_reset(DVDemuxContext *c, int64_t ts_video);
 
 #endif /* AVFORMAT_DV_H */
diff --git a/tests/ref/seek/lavf-dv b/tests/ref/seek/lavf-dv
index f63e4460be..95f19d28f0 100644
--- a/tests/ref/seek/lavf-dv
+++ b/tests/ref/seek/lavf-dv
@@ -3,9 +3,9 @@  ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:1  ts: 1.894167
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
-ret: 0         st: 0 flags:0  ts: 0.800000
+ret: 0         st: 0 flags:0  ts: 0.788333
 ret: 0         st: 0 flags:1 dts: 0.800000 pts: 0.800000 pos:2880000 size:144000
-ret: 0         st: 0 flags:1  ts:-0.320000
+ret: 0         st: 0 flags:1  ts:-0.317500
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st: 1 flags:0  ts: 2.560000
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
@@ -15,9 +15,9 @@  ret: 0         st:-1 flags:0  ts: 0.365002
 ret: 0         st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos:1296000 size:144000
 ret: 0         st:-1 flags:1  ts:-0.740831
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:0  ts: 2.160000
+ret: 0         st: 0 flags:0  ts: 2.153333
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
-ret: 0         st: 0 flags:1  ts: 1.040000
+ret: 0         st: 0 flags:1  ts: 1.047500
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
 ret: 0         st: 1 flags:0  ts:-0.040000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
@@ -27,9 +27,9 @@  ret: 0         st:-1 flags:0  ts: 1.730004
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: 0.640000 pts: 0.640000 pos:2304000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.480000
+ret: 0         st: 0 flags:0  ts:-0.481667
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.400000
+ret: 0         st: 0 flags:1  ts: 2.412500
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
 ret: 0         st: 1 flags:0  ts: 1.320000
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
@@ -39,9 +39,9 @@  ret: 0         st:-1 flags:0  ts:-0.904994
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:1  ts: 1.989173
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
-ret: 0         st: 0 flags:0  ts: 0.880000
+ret: 0         st: 0 flags:0  ts: 0.883333
 ret: 0         st: 0 flags:1 dts: 0.880000 pts: 0.880000 pos:3168000 size:144000
-ret: 0         st: 0 flags:1  ts:-0.240000
+ret: 0         st: 0 flags:1  ts:-0.222500
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st: 1 flags:0  ts: 2.680000
 ret: 0         st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos:3456000 size:144000
diff --git a/tests/ref/seek/vsynth_lena-dv b/tests/ref/seek/vsynth_lena-dv
index d318794157..afed1fbe72 100644
--- a/tests/ref/seek/vsynth_lena-dv
+++ b/tests/ref/seek/vsynth_lena-dv
@@ -3,49 +3,49 @@  ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:1  ts: 1.894167
 ret: 0         st: 0 flags:1 dts: 1.880000 pts: 1.880000 pos:6768000 size:144000
-ret: 0         st: 0 flags:0  ts: 0.800000
+ret: 0         st: 0 flags:0  ts: 0.788333
 ret: 0         st: 0 flags:1 dts: 0.800000 pts: 0.800000 pos:2880000 size:144000
-ret: 0         st: 0 flags:1  ts:-0.320000
+ret: 0         st: 0 flags:1  ts:-0.317500
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:0  ts: 2.576668
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:1  ts: 1.470835
 ret: 0         st: 0 flags:1 dts: 1.480000 pts: 1.480000 pos:5328000 size:144000
-ret: 0         st: 0 flags:0  ts: 0.360000
+ret: 0         st: 0 flags:0  ts: 0.365000
 ret: 0         st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos:1296000 size:144000
-ret: 0         st: 0 flags:1  ts:-0.760000
+ret: 0         st: 0 flags:1  ts:-0.740833
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:0  ts: 2.153336
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:1  ts: 1.047503
 ret: 0         st: 0 flags:1 dts: 1.040000 pts: 1.040000 pos:3744000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.040000
+ret: 0         st: 0 flags:0  ts:-0.058333
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.840000
+ret: 0         st: 0 flags:1  ts: 2.835833
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:0  ts: 1.730004
 ret: 0         st: 0 flags:1 dts: 1.720000 pts: 1.720000 pos:6192000 size:144000
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: 0.640000 pts: 0.640000 pos:2304000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.480000
+ret: 0         st: 0 flags:0  ts:-0.481667
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.400000
+ret: 0         st: 0 flags:1  ts: 2.412500
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:0  ts: 1.306672
 ret: 0         st: 0 flags:1 dts: 1.320000 pts: 1.320000 pos:4752000 size:144000
 ret: 0         st:-1 flags:1  ts: 0.200839
 ret: 0         st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: 720000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.920000
+ret: 0         st: 0 flags:0  ts:-0.905000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.000000
+ret: 0         st: 0 flags:1  ts: 1.989167
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:0  ts: 0.883340
 ret: 0         st: 0 flags:1 dts: 0.880000 pts: 0.880000 pos:3168000 size:144000
 ret: 0         st:-1 flags:1  ts:-0.222493
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:0  ts: 2.680000
+ret: 0         st: 0 flags:0  ts: 2.671667
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
-ret: 0         st: 0 flags:1  ts: 1.560000
+ret: 0         st: 0 flags:1  ts: 1.565833
 ret: 0         st: 0 flags:1 dts: 1.560000 pts: 1.560000 pos:5616000 size:144000
 ret: 0         st:-1 flags:0  ts: 0.460008
 ret: 0         st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos:1728000 size:144000
diff --git a/tests/ref/seek/vsynth_lena-dv-411 b/tests/ref/seek/vsynth_lena-dv-411
index d318794157..afed1fbe72 100644
--- a/tests/ref/seek/vsynth_lena-dv-411
+++ b/tests/ref/seek/vsynth_lena-dv-411
@@ -3,49 +3,49 @@  ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:1  ts: 1.894167
 ret: 0         st: 0 flags:1 dts: 1.880000 pts: 1.880000 pos:6768000 size:144000
-ret: 0         st: 0 flags:0  ts: 0.800000
+ret: 0         st: 0 flags:0  ts: 0.788333
 ret: 0         st: 0 flags:1 dts: 0.800000 pts: 0.800000 pos:2880000 size:144000
-ret: 0         st: 0 flags:1  ts:-0.320000
+ret: 0         st: 0 flags:1  ts:-0.317500
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:0  ts: 2.576668
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:1  ts: 1.470835
 ret: 0         st: 0 flags:1 dts: 1.480000 pts: 1.480000 pos:5328000 size:144000
-ret: 0         st: 0 flags:0  ts: 0.360000
+ret: 0         st: 0 flags:0  ts: 0.365000
 ret: 0         st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos:1296000 size:144000
-ret: 0         st: 0 flags:1  ts:-0.760000
+ret: 0         st: 0 flags:1  ts:-0.740833
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
 ret: 0         st:-1 flags:0  ts: 2.153336
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:1  ts: 1.047503
 ret: 0         st: 0 flags:1 dts: 1.040000 pts: 1.040000 pos:3744000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.040000
+ret: 0         st: 0 flags:0  ts:-0.058333
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.840000
+ret: 0         st: 0 flags:1  ts: 2.835833
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:0  ts: 1.730004
 ret: 0         st: 0 flags:1 dts: 1.720000 pts: 1.720000 pos:6192000 size:144000
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: 0.640000 pts: 0.640000 pos:2304000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.480000
+ret: 0         st: 0 flags:0  ts:-0.481667
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.400000
+ret: 0         st: 0 flags:1  ts: 2.412500
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:0  ts: 1.306672
 ret: 0         st: 0 flags:1 dts: 1.320000 pts: 1.320000 pos:4752000 size:144000
 ret: 0         st:-1 flags:1  ts: 0.200839
 ret: 0         st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos: 720000 size:144000
-ret: 0         st: 0 flags:0  ts:-0.920000
+ret: 0         st: 0 flags:0  ts:-0.905000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:1  ts: 2.000000
+ret: 0         st: 0 flags:1  ts: 1.989167
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
 ret: 0         st:-1 flags:0  ts: 0.883340
 ret: 0         st: 0 flags:1 dts: 0.880000 pts: 0.880000 pos:3168000 size:144000
 ret: 0         st:-1 flags:1  ts:-0.222493
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:144000
-ret: 0         st: 0 flags:0  ts: 2.680000
+ret: 0         st: 0 flags:0  ts: 2.671667
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:7056000 size:144000
-ret: 0         st: 0 flags:1  ts: 1.560000
+ret: 0         st: 0 flags:1  ts: 1.565833
 ret: 0         st: 0 flags:1 dts: 1.560000 pts: 1.560000 pos:5616000 size:144000
 ret: 0         st:-1 flags:0  ts: 0.460008
 ret: 0         st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos:1728000 size:144000
diff --git a/tests/ref/seek/vsynth_lena-dv-50 b/tests/ref/seek/vsynth_lena-dv-50
index fae6d1b225..3b1d69ffa6 100644
--- a/tests/ref/seek/vsynth_lena-dv-50
+++ b/tests/ref/seek/vsynth_lena-dv-50
@@ -3,49 +3,49 @@  ret: 0         st:-1 flags:0  ts:-1.000000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
 ret: 0         st:-1 flags:1  ts: 1.894167
 ret: 0         st: 0 flags:1 dts: 1.880000 pts: 1.880000 pos:13536000 size:288000
-ret: 0         st: 0 flags:0  ts: 0.800000
+ret: 0         st: 0 flags:0  ts: 0.788333
 ret: 0         st: 0 flags:1 dts: 0.800000 pts: 0.800000 pos:5760000 size:288000
-ret: 0         st: 0 flags:1  ts:-0.320000
+ret: 0         st: 0 flags:1  ts:-0.317500
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
 ret: 0         st:-1 flags:0  ts: 2.576668
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:14112000 size:288000
 ret: 0         st:-1 flags:1  ts: 1.470835
 ret: 0         st: 0 flags:1 dts: 1.480000 pts: 1.480000 pos:10656000 size:288000
-ret: 0         st: 0 flags:0  ts: 0.360000
+ret: 0         st: 0 flags:0  ts: 0.365000
 ret: 0         st: 0 flags:1 dts: 0.360000 pts: 0.360000 pos:2592000 size:288000
-ret: 0         st: 0 flags:1  ts:-0.760000
+ret: 0         st: 0 flags:1  ts:-0.740833
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
 ret: 0         st:-1 flags:0  ts: 2.153336
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:14112000 size:288000
 ret: 0         st:-1 flags:1  ts: 1.047503
 ret: 0         st: 0 flags:1 dts: 1.040000 pts: 1.040000 pos:7488000 size:288000
-ret: 0         st: 0 flags:0  ts:-0.040000
+ret: 0         st: 0 flags:0  ts:-0.058333
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
-ret: 0         st: 0 flags:1  ts: 2.840000
+ret: 0         st: 0 flags:1  ts: 2.835833
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:14112000 size:288000
 ret: 0         st:-1 flags:0  ts: 1.730004
 ret: 0         st: 0 flags:1 dts: 1.720000 pts: 1.720000 pos:12384000 size:288000
 ret: 0         st:-1 flags:1  ts: 0.624171
 ret: 0         st: 0 flags:1 dts: 0.640000 pts: 0.640000 pos:4608000 size:288000
-ret: 0         st: 0 flags:0  ts:-0.480000
+ret: 0         st: 0 flags:0  ts:-0.481667
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
-ret: 0         st: 0 flags:1  ts: 2.400000
+ret: 0         st: 0 flags:1  ts: 2.412500
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:14112000 size:288000
 ret: 0         st:-1 flags:0  ts: 1.306672
 ret: 0         st: 0 flags:1 dts: 1.320000 pts: 1.320000 pos:9504000 size:288000
 ret: 0         st:-1 flags:1  ts: 0.200839
 ret: 0         st: 0 flags:1 dts: 0.200000 pts: 0.200000 pos:1440000 size:288000
-ret: 0         st: 0 flags:0  ts:-0.920000
+ret: 0         st: 0 flags:0  ts:-0.905000
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
-ret: 0         st: 0 flags:1  ts: 2.000000
+ret: 0         st: 0 flags:1  ts: 1.989167
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:14112000 size:288000
 ret: 0         st:-1 flags:0  ts: 0.883340
 ret: 0         st: 0 flags:1 dts: 0.880000 pts: 0.880000 pos:6336000 size:288000
 ret: 0         st:-1 flags:1  ts:-0.222493
 ret: 0         st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos:      0 size:288000
-ret: 0         st: 0 flags:0  ts: 2.680000
+ret: 0         st: 0 flags:0  ts: 2.671667
 ret: 0         st: 0 flags:1 dts: 1.960000 pts: 1.960000 pos:14112000 size:288000
-ret: 0         st: 0 flags:1  ts: 1.560000
+ret: 0         st: 0 flags:1  ts: 1.565833
 ret: 0         st: 0 flags:1 dts: 1.560000 pts: 1.560000 pos:11232000 size:288000
 ret: 0         st:-1 flags:0  ts: 0.460008
 ret: 0         st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos:3456000 size:288000