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

Git pushed a commit to branch master
in repository ffmpeg.

commit e03b034e45e68450e16f913c8aaf5ec362bc1446
Author:     Niklas Haas <[email protected]>
AuthorDate: Fri Jan 23 10:46:55 2026 +0100
Commit:     Niklas Haas <[email protected]>
CommitDate: Sat Feb 7 10:02:36 2026 +0000

    avformat/http: re-use keep-alive connection for small seeks
    
    When the previous reply was a partial response (e.g. due to a seek to the
    end of the file), and the remaining data from that partial response is
    below the short seek size threshold, we can serve this seek by just draining
    that data and re-using the existing connection.
    
    This can currently only happen when using keep-alive connections
    (-multiple_requests 1) and seeking from the end of the file to somewhere
    else, in which case the file's tail can be drained and the connection 
re-used.
    
    Under other circumstances, however, we still need to force a reconnection,
    because we do not yet send partial range requests. (This will be changed in 
the
    following commit)
    
    We need to take special care not to regress the existing fallback logic
    for when `http_open_cnx` fails, so here is a quick case analysis:
    
    non-drain path:
    - identical to the current
    
    soft drain fails: (ffurl_read error path)
    - s->hd = old_hd = NULL
    - http_open_cnx() always opens a new connection
    - on failure, old buffer is restored and s->hd remains NULL
    
    soft drain succeeds, http_open_cnx() fails:
    - s->hd is set to NULL by http_open_cnx() failure path
    - old_hd was never set, so remains NULL
    - old buffer is restored, s->hd remains NULL
    
    In either case, the outcome that any (previously valid) buffer is left 
as-is,
    the offset is unchanged, and the connection ends up closed (s->hd == NULL).
    This is okay to do after the previous change to http_buf_read, which allows
    it to internally re-open the connection if needed.
---
 libavformat/http.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/libavformat/http.c b/libavformat/http.c
index c78f33681e..8c98ea0a8f 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -2022,11 +2022,12 @@ static int http_close(URLContext *h)
 static int64_t http_seek_internal(URLContext *h, int64_t off, int whence, int 
force_reconnect)
 {
     HTTPContext *s = h->priv_data;
-    URLContext *old_hd = s->hd;
+    URLContext *old_hd = NULL;
     uint64_t old_off = s->off;
     uint8_t old_buf[BUFFER_SIZE];
     int old_buf_size, ret;
     AVDictionary *options = NULL;
+    uint8_t discard[4096];
 
     if (whence == AVSEEK_SIZE)
         return s->filesize;
@@ -2068,7 +2069,27 @@ static int64_t http_seek_internal(URLContext *h, int64_t 
off, int whence, int fo
     /* we save the old context in case the seek fails */
     old_buf_size = s->buf_end - s->buf_ptr;
     memcpy(old_buf, s->buf_ptr, old_buf_size);
-    s->hd = NULL;
+
+    /* try to reuse existing connection for small seeks */
+    uint64_t remaining = s->range_end - old_off - old_buf_size;
+    if (!s->willclose && s->range_end && remaining <= ffurl_get_short_seek(h)) 
{
+        /* drain remaining data left on the wire from previous request */
+        av_log(h, AV_LOG_DEBUG, "Soft-seeking to offset %"PRIu64" by draining "
+               "%"PRIu64" remaining byte(s)\n", s->off, remaining);
+        while (remaining) {
+            int ret = ffurl_read(s->hd, discard, FFMIN(remaining, 
sizeof(discard)));
+            if (ret < 0 || ret == AVERROR_EOF || (ret == 0 && remaining)) {
+                /* connection broken or stuck, need to reopen */
+                ffurl_closep(&s->hd);
+                break;
+            }
+            remaining -= ret;
+        }
+    } else {
+        /* can't soft seek; always open new connection */
+        old_hd = s->hd;
+        s->hd = NULL;
+    }
 
     /* if it fails, continue on old connection */
     if ((ret = http_open_cnx(h, &options)) < 0) {

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

Reply via email to