diff --git a/memfile.c b/memfile.c index a8feea2..a03018f 100644 --- a/memfile.c +++ b/memfile.c @@ -65,6 +65,23 @@ size_t cmemfile_read(CMemFile* f, size_t buf_len, char* buf) { return le; } +int memfile_seek(MemFile* f, int64_t offset, int origin) { + if (!f) return 1; + int64_t npos = 0; + if (origin == SEEK_SET) { + npos = offset; + } else if (origin == SEEK_CUR) { + npos = f->loc + offset; + } else if (origin == SEEK_END) { + npos = f->len + offset; + } else { + return 1; + } + if (npos < 0 || npos > f->len) return 1; + f->loc = npos; + return 0; +} + int cmemfile_seek(CMemFile* f, int64_t offset, int origin) { if (!f) return 1; int64_t npos = 0; @@ -87,6 +104,11 @@ int64_t cmemfile_tell(CMemFile* f) { return f->loc; } +int64_t memfile_tell(MemFile* f) { + if (!f) return -1; + return f->loc; +} + #define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24)) #define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d)) #define AVERROR_EOF FFERRTAG( 'E','O','F',' ') diff --git a/memfile.h b/memfile.h index 3676998..4c1a792 100644 --- a/memfile.h +++ b/memfile.h @@ -34,7 +34,9 @@ void free_memfile(MemFile* f); void free_cmemfile(CMemFile* f); size_t memfile_read(MemFile* f, char* buf, size_t buf_len); size_t cmemfile_read(CMemFile* f, size_t buf_len, char* buf); +int memfile_seek(MemFile* f, int64_t offset, int origin); int cmemfile_seek(CMemFile* f, int64_t offset, int origin); +int64_t memfile_tell(MemFile* f); int64_t cmemfile_tell(CMemFile* f); int memfile_readpacket(void* f, uint8_t* buf, int buf_size); size_t cmemfile_read2(void* f, size_t buf_len, char* buf);