• Bryan Huh's avatar
    avformat/async: Fix bug where async could not recover after seek to eof · d07585f0
    Bryan Huh authored
    When async issues its inner seek via ffurl_seek, it treats failures as
    EOF being reached. This is not consistent with the behavior of other
    protocols (e.g. http, cache) which continue to tolerate reads after
    failed seeks, and therefore does not interact correctly with them.
    
    A common pattern where this manifests itself is where avio_seek is
    called with pos to be the end-of-file - the http range-request would
    fail here, and async would set io_eof_reached to 1. The background
    thread would then refuse to read more bytes, and subsequent reads would
    only empty the fifo and end in an error.
    
    Presumably the code may have expected subsequent seeks to unset the
    io_eof_reached but this is not guaranteed to be true - a subsequent seek
    that lands in the AVIOContext's buffer (the fact that the
    previously-failed avio_seek leaves the AVIOContext's buffer intact also
    suggests that follow-up reads are expected to be tolerated) would not be
    issued to the async_seek function, and when that buffer is drained only
    async_read calls would follow, leading to the same error just described.
    Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
    d07585f0
async.c 18.6 KB