[FFmpeg-cvslog] avformat/cache: remember EOF point if hit and use it to handle SEEK_END

Michael Niedermayer git at videolan.org
Thu Dec 25 22:11:05 CET 2014


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Thu Dec 25 21:27:04 2014 +0100| [681559d3ffebcba3c525b7c7f94a58cc36847ee1] | committer: Michael Niedermayer

avformat/cache: remember EOF point if hit and use it to handle SEEK_END

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=681559d3ffebcba3c525b7c7f94a58cc36847ee1
---

 libavformat/cache.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/libavformat/cache.c b/libavformat/cache.c
index ef33d17..9d1b4b9 100644
--- a/libavformat/cache.c
+++ b/libavformat/cache.c
@@ -57,6 +57,7 @@ typedef struct Context {
     int64_t cache_pos;
     int64_t inner_pos;
     int64_t end;
+    int is_true_eof;
     URLContext *inner;
     int64_t cache_hit, cache_miss;
 } Context;
@@ -174,6 +175,10 @@ static int cache_read(URLContext *h, unsigned char *buf, int size)
     }
 
     r = ffurl_read(c->inner, buf, size);
+    if (r == 0 && size>0) {
+        c->is_true_eof = 1;
+        av_assert0(c->end >= c->logical_pos);
+    }
     if (r<=0)
         return r;
     c->inner_pos += r;
@@ -198,6 +203,8 @@ static int64_t cache_seek(URLContext *h, int64_t pos, int whence)
             if (ffurl_seek(c->inner, c->inner_pos, SEEK_SET) < 0)
                 av_log(h, AV_LOG_ERROR, "Inner protocol failed to seekback\n");
         }
+        if (pos > 0)
+            c->is_true_eof = 1;
         c->end = FFMAX(c->end, pos);
         return pos;
     }
@@ -205,6 +212,9 @@ static int64_t cache_seek(URLContext *h, int64_t pos, int whence)
     if (whence == SEEK_CUR) {
         whence = SEEK_SET;
         pos += c->logical_pos;
+    } else if (whence == SEEK_END && c->is_true_eof) {
+        whence = SEEK_SET;
+        pos += c->end;
     }
 
     if (whence == SEEK_SET && pos >= 0 && pos < c->end) {



More information about the ffmpeg-cvslog mailing list