This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch master
in repository ffmpeg.

commit caa3fa6af070c1eeee59da027fdcde326fc64a89
Author:     Kacper Michajłow <[email protected]>
AuthorDate: Wed Jun 17 03:03:44 2026 +0200
Commit:     Kacper Michajłow <[email protected]>
CommitDate: Tue Jun 23 20:40:28 2026 +0200

    avformat/hls: fix seeking to before the first timestamp
    
    find_timestamp_in_playlist() already selects the first segment when the
    target is below the playlist's first timestamp, but returns 0.
    hls_read_seek() treats that as a failure, and all seek operation is
    failed.
    
    This breaks seeking to the very start whenever the requested timestamp
    is slightly below the first one. Clamp such targets to the first segment
    and report success instead.
    
    Fixes: 
https://github.com/mpv-player/mpv/issues/14840#issuecomment-4703186169
    Signed-off-by: Kacper Michajłow <[email protected]>
---
 libavformat/hls.c  |  5 ++++-
 tests/ref/seek/hls | 33 ++++++++++++++++++++++-----------
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index 8788deee7d..ea58a6d2f6 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -2019,8 +2019,11 @@ static int find_timestamp_in_playlist(HLSContext *c, 
struct playlist *pls,
                   0 : c->first_timestamp;
 
     if (timestamp < pos) {
+        /* Seeking before the start of the playlist, clamp to the first 
segment. */
         *seq_no = pls->start_seq_no;
-        return 0;
+        if (seg_start_ts)
+            *seg_start_ts = pos;
+        return 1;
     }
 
     for (i = 0; i < pls->n_segments; i++) {
diff --git a/tests/ref/seek/hls b/tests/ref/seek/hls
index 5b23cf6f96..a9b3badaf8 100644
--- a/tests/ref/seek/hls
+++ b/tests/ref/seek/hls
@@ -1,7 +1,10 @@
 ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
-ret:-1         st:-1 flags:0  ts:-1.000000
-ret:-1         st:-1 flags:1  ts:-0.105833
-ret:-1         st: 0 flags:0  ts: 0.788333
+ret: 0         st:-1 flags:0  ts:-1.000000
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
+ret: 0         st:-1 flags:1  ts:-0.105833
+ret: 0         st: 0 flags:1 dts: 1.515211 pts: 1.515211 pos:     -1 size:  
1254
+ret: 0         st: 0 flags:0  ts: 0.788333
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
 ret: 0         st: 0 flags:1  ts: 1.682500
 ret: 0         st: 0 flags:1 dts: 1.698078 pts: 1.698078 pos:  11092 size:  
1253
 ret: 0         st: 1 flags:0  ts: 2.576667
@@ -10,9 +13,12 @@ ret: 0         st: 1 flags:1  ts: 3.470833
 ret: 0         st: 0 flags:1 dts: 1.515211 pts: 1.515211 pos:     -1 size:  
1254
 ret: 0         st:-1 flags:0  ts: 4.365002
 ret: 0         st: 0 flags:1 dts: 4.388689 pts: 4.388689 pos:  45308 size:  
1254
-ret:-1         st:-1 flags:1  ts:-0.740831
-ret:-1         st: 0 flags:0  ts: 0.153333
-ret:-1         st: 0 flags:1  ts: 1.047500
+ret: 0         st:-1 flags:1  ts:-0.740831
+ret: 0         st: 0 flags:1 dts: 1.515211 pts: 1.515211 pos:     -1 size:  
1254
+ret: 0         st: 0 flags:0  ts: 0.153333
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
+ret: 0         st: 0 flags:1  ts: 1.047500
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
 ret: 0         st: 1 flags:0  ts: 1.941667
 ret: 0         st: 0 flags:1 dts: 1.959300 pts: 1.959300 pos:  24252 size:  
1254
 ret: 0         st: 1 flags:1  ts: 2.835833
@@ -21,9 +27,12 @@ ret: 0         st:-1 flags:0  ts: 3.730004
 ret: 0         st: 0 flags:1 dts: 3.735622 pts: 3.735622 pos:     -1 size:  
1254
 ret: 0         st:-1 flags:1  ts: 4.624171
 ret: 0         st: 0 flags:1 dts: 4.493178 pts: 4.493178 pos:  50572 size:  
1254
-ret:-1         st: 0 flags:0  ts:-0.481667
-ret:-1         st: 0 flags:1  ts: 0.412500
-ret:-1         st: 1 flags:0  ts: 1.306667
+ret: 0         st: 0 flags:0  ts:-0.481667
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
+ret: 0         st: 0 flags:1  ts: 0.412500
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
+ret: 0         st: 1 flags:0  ts: 1.306667
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
 ret: 0         st: 1 flags:1  ts: 2.200844
 ret: 0         st: 0 flags:1 dts: 1.515211 pts: 1.515211 pos:     -1 size:  
1254
 ret: 0         st:-1 flags:0  ts: 3.095006
@@ -32,8 +41,10 @@ ret: 0         st:-1 flags:1  ts: 3.989173
 ret: 0         st: 0 flags:1 dts: 1.515211 pts: 1.515211 pos:     -1 size:  
1254
 ret: 0         st: 0 flags:0  ts: 4.883344
 ret: 0         st: 0 flags:1 dts: 4.885011 pts: 4.885011 pos:     -1 size:  
1253
-ret:-1         st: 0 flags:1  ts:-0.222489
-ret:-1         st: 1 flags:0  ts: 0.671678
+ret: 0         st: 0 flags:1  ts:-0.222489
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
+ret: 0         st: 1 flags:0  ts: 0.671678
+ret: 0         st: 1 flags:1 dts: 1.400000 pts: 1.500000 pos:    564 size:  
3913
 ret: 0         st: 1 flags:1  ts: 1.565844
 ret: 0         st: 0 flags:1 dts: 1.515211 pts: 1.515211 pos:     -1 size:  
1254
 ret: 0         st:-1 flags:0  ts: 2.460008

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to