[FFmpeg-devel] [PATCH] avformat/hls Implement support for using AVSEEK_FLAG_BACKWARD when seeking

Gustav Grusell gustav.grusell at gmail.com
Fri May 14 22:42:25 EEST 2021


Before, seeking in hls streams would always seek to the next keyframe after the given timestamp.
With this fix, if AVSEEK_FLAG_BACKWARD is set, seeking will be to the first keyframe of the
segment containing the given timestamp. This fixes #6850.
---
 libavformat/hls.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index 8fc6924c90..3f1fd2cb70 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -2199,10 +2199,15 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
 
                     tb = get_timebase(pls);
                     ts_diff = av_rescale_rnd(pls->pkt->dts, AV_TIME_BASE,
-                                            tb.den, AV_ROUND_DOWN) -
-                            pls->seek_timestamp;
-                    if (ts_diff >= 0 && (pls->seek_flags  & AVSEEK_FLAG_ANY ||
-                                        pls->pkt->flags & AV_PKT_FLAG_KEY)) {
+                                             tb.den, AV_ROUND_DOWN) -
+                              pls->seek_timestamp;
+                    /* If AVSEEK_FLAG_BACKWARD set and not AVSEEK_FLAG_ANY,
+                     * we return the first keyframe encountered */
+                    if ((pls->seek_flags & AVSEEK_FLAG_BACKWARD &&
+                         !(pls->seek_flags & AVSEEK_FLAG_ANY) &&
+                         pls->pkt->flags & AV_PKT_FLAG_KEY) ||
+                        (ts_diff >= 0 && (pls->seek_flags  & AVSEEK_FLAG_ANY ||
+                                          pls->pkt->flags & AV_PKT_FLAG_KEY))) {
                         pls->seek_timestamp = AV_NOPTS_VALUE;
                         break;
                     }
-- 
2.25.1



More information about the ffmpeg-devel mailing list