On Thu, 31 Dec 2020, "zhilizhao(赵志立)" wrote:



On Dec 31, 2020, at 6:51 PM, Marton Balint <c...@passwd.hu> wrote:



On Thu, 31 Dec 2020, Zhao Zhili wrote:

Rounding min_ts towards +infinity and max_ts towards -infinity can
make ts out of the [min_ts, max_ts] range, and then leads to seek
failure. For example,

I think this is intentional to adhere to the docs of the function:

"Seeking will be done so that the point from which all active streams
can be presented successfully will be closest to ts and within min/max_ts."

If you round down min_ts, you might return a packet with a timestamp less than 
the original min_ts, which contradicts the documentation.


Yes, it’s not comply with the documentation strictly. On the other side, does
the documentation have strong guarantee about the rounding error? Rounding
error is less of a surprise than seek failure in my opinion.

If the question is what the user would expect, then the answer is probably simple rounding for both min_ts and max_ts. That should also solve your error of ts becoming out of the [min_ts,max_ts] interval.

However in your example the time base of the stream is more precise than AV_TIME_BASE_Q, and that can cause unexpected behaviour regardless of the rouding you use. If start_time is not represented accurately, a seek attempt to start_time may well cause a seek after, or before the actual start of the stream, because the error is at most AV_TIME_BASE_Q, not AVStream->time_base.

Regards,
Marton

ffmpeg.c seek_to_start() call avformat_seek_file() with max_ts equal to ts.
If avformat_seek_file() should be kept as it is, then the caller should be 
fixed.

Regards,
Marton



max_ts = ts = -25057
time_base = (num = 1, den = 14112000)

After rescale, ts = -353604, and max_ts = -353605.
---
libavformat/utils.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 503e583ad0..69a0f901b2 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2500,10 +2500,10 @@ int avformat_seek_file(AVFormatContext *s, int 
stream_index, int64_t min_ts,
           ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base);
           min_ts = av_rescale_rnd(min_ts, time_base.den,
                                   time_base.num * (int64_t)AV_TIME_BASE,
-                                    AV_ROUND_UP   | AV_ROUND_PASS_MINMAX);
+                                    AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
           max_ts = av_rescale_rnd(max_ts, time_base.den,
                                   time_base.num * (int64_t)AV_TIME_BASE,
-                                    AV_ROUND_DOWN | AV_ROUND_PASS_MINMAX);
+                                    AV_ROUND_UP | AV_ROUND_PASS_MINMAX);
           stream_index = 0;
       }
--
2.28.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to