diff --git a/libavformat/avio.c b/libavformat/avio.c index a2b8a83259..f2fe0e13c6 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -148,9 +148,12 @@ offset_t url_filesize(URLContext *h) { offset_t pos, size; + size= url_seek(h, 0, AVSEEK_SIZE); + if(size<0){ pos = url_seek(h, 0, SEEK_CUR); size = url_seek(h, -1, SEEK_END)+1; url_seek(h, pos, SEEK_SET); + } return size; } diff --git a/libavformat/avio.h b/libavformat/avio.h index f0fd1a85cf..27fb241e33 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -69,6 +69,8 @@ void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); /* not implemented */ int url_poll(URLPollEntry *poll_table, int n, int timeout); +#define AVSEEK_SIZE 0x10000 + typedef struct URLProtocol { const char *name; int (*url_open)(URLContext *h, const char *filename, int flags); diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index f3e7d5081f..450b4cf11d 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -170,8 +170,11 @@ offset_t url_fsize(ByteIOContext *s) if (!s->seek) return -EPIPE; + size = s->seek(s->opaque, 0, AVSEEK_SIZE); + if(size<0){ size = s->seek(s->opaque, -1, SEEK_END) + 1; s->seek(s->opaque, s->pos, SEEK_SET); + } return size; }