diff mbox series

[FFmpeg-devel,06/23] fftools/ffmpeg_enc: avoid breaking exactly integer timestamps in vsync code

Message ID 20230531145453.20994-6-anton@khirnov.net
State Accepted
Commit ccf219e361957eef8fab45ce8b02cdf4d42e5e28
Headers show
Series [FFmpeg-devel,01/23] fftools/ffmpeg_enc: move nb_frames{dup, drop} globals into OutputStream | expand

Checks

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

Commit Message

Anton Khirnov May 31, 2023, 2:54 p.m. UTC
The code will currently add a small offset to avoid exact midpoints, but
this can cause inexact results when a float timestamp is exactly
representable as an integer.

Fixes off-by-one in the first frame duration in multiple FATE tests.
---
 fftools/ffmpeg_enc.c             | 6 ++++--
 tests/ref/fate/apng-osample      | 2 +-
 tests/ref/fate/film-cvid         | 2 +-
 tests/ref/fate/filter-concat-vfr | 2 +-
 tests/ref/fate/gif-gray          | 2 +-
 5 files changed, 8 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
index fab71ca0c0..d390e384ed 100644
--- a/fftools/ffmpeg_enc.c
+++ b/fftools/ffmpeg_enc.c
@@ -888,9 +888,11 @@  static double adjust_frame_pts_to_encoder_tb(OutputFile *of, OutputStream *ost,
     float_pts = av_rescale_q(frame->pts, filter_tb, tb) -
                 av_rescale_q(start_time, AV_TIME_BASE_Q, tb);
     float_pts /= 1 << extra_bits;
-    // avoid exact midoints to reduce the chance of rounding differences, this
+    // when float_pts is not exactly an integer,
+    // avoid exact midpoints to reduce the chance of rounding differences, this
     // can be removed in case the fps code is changed to work with integers
-    float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
+    if (float_pts != llrint(float_pts))
+        float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
 
     frame->pts = av_rescale_q(frame->pts, filter_tb, enc->time_base) -
                  av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);
diff --git a/tests/ref/fate/apng-osample b/tests/ref/fate/apng-osample
index c91dd5284d..6cf74a99ee 100644
--- a/tests/ref/fate/apng-osample
+++ b/tests/ref/fate/apng-osample
@@ -3,7 +3,7 @@ 
 #codec_id 0: rawvideo
 #dimensions 0: 116x135
 #sar 0: 0/1
-0,          0,          0,        2,    62640, 0x31eb581d
+0,          0,          0,        3,    62640, 0x31eb581d
 0,          3,          3,        3,    62640, 0x29e11b82
 0,          6,          6,        3,    62640, 0x207ed588
 0,          9,          9,        3,    62640, 0x3845c906
diff --git a/tests/ref/fate/film-cvid b/tests/ref/fate/film-cvid
index 60bbc192d8..428cb6e9f0 100644
--- a/tests/ref/fate/film-cvid
+++ b/tests/ref/fate/film-cvid
@@ -3,7 +3,7 @@ 
 #codec_id 0: rawvideo
 #dimensions 0: 320x224
 #sar 0: 0/1
-0,          0,          0,        1,   215040, 0x067c5362
+0,          0,          0,        2,   215040, 0x067c5362
 0,          2,          2,        2,   215040, 0xd9eacb98
 0,          4,          4,        2,   215040, 0x3c8a4cbd
 0,          6,          6,        2,   215040, 0xbdf996e1
diff --git a/tests/ref/fate/filter-concat-vfr b/tests/ref/fate/filter-concat-vfr
index 66e9007da8..3d984a4968 100644
--- a/tests/ref/fate/filter-concat-vfr
+++ b/tests/ref/fate/filter-concat-vfr
@@ -8,7 +8,7 @@ 
 #codec_id 1: pcm_s16le
 #sample_rate 1: 44100
 #channel_layout_name 1: mono
-0,          0,          0,   199999,   230400, 0x88c4d19a
+0,          0,          0,   200000,   230400, 0x88c4d19a
 1,          0,          0,     1024,     2048, 0xb3f10192
 1,       1024,       1024,     1024,     2048, 0xb340fe4e
 1,       2048,       2048,     1024,     2048, 0x0a5f0111
diff --git a/tests/ref/fate/gif-gray b/tests/ref/fate/gif-gray
index aa3969212d..c246d8a670 100644
--- a/tests/ref/fate/gif-gray
+++ b/tests/ref/fate/gif-gray
@@ -3,7 +3,7 @@ 
 #codec_id 0: rawvideo
 #dimensions 0: 480x360
 #sar 0: 0/1
-0,          0,          0,        4,   691200, 0xef6c0f3d
+0,          0,          0,        5,   691200, 0xef6c0f3d
 0,          5,          5,        2,   691200, 0xc18b32de
 0,          7,          7,        2,   691200, 0x2395a3d7
 0,          9,          9,        2,   691200, 0x81dc3cf2