diff --git a/src/Record/MP4.cpp b/src/Record/MP4.cpp index f9222899..770d8860 100644 --- a/src/Record/MP4.cpp +++ b/src/Record/MP4.cpp @@ -128,11 +128,11 @@ int MP4FileDisk::onWrite(const void *data, size_t bytes) { return bytes == fwrite(data, 1, bytes, _file.get()) ? 0 : ferror(_file.get()); } -int MP4FileDisk::onSeek(uint64_t offset) { - return fseek64(_file.get(), offset, SEEK_SET); +int MP4FileDisk::onSeek(int64_t offset) { + return fseek64(_file.get(), offset, offset >= 0 ? SEEK_SET : SEEK_END); } -uint64_t MP4FileDisk::onTell() { +int64_t MP4FileDisk::onTell() { return ftell64(_file.get()); } @@ -149,15 +149,21 @@ size_t MP4FileMemory::fileSize() const{ return _memory.size(); } -uint64_t MP4FileMemory::onTell(){ +int64_t MP4FileMemory::onTell(){ return _offset; } -int MP4FileMemory::onSeek(uint64_t offset){ - if (offset > _memory.size()) { - return -1; +int MP4FileMemory::onSeek(int64_t offset){ + if (offset < 0) { + if (offset + _offset < 0) + return -1; + _offset += offset; + } else { + if (offset > _memory.size()) { + return -1; + } + _offset = offset; } - _offset = offset; return 0; } diff --git a/src/Record/MP4.h b/src/Record/MP4.h index cc815e89..68967628 100644 --- a/src/Record/MP4.h +++ b/src/Record/MP4.h @@ -66,7 +66,7 @@ public: * [AUTO-TRANSLATED:f8a5b290] */ - virtual uint64_t onTell() = 0; + virtual int64_t onTell() = 0; /** * seek至文件某处 @@ -78,7 +78,7 @@ public: * [AUTO-TRANSLATED:936089eb] */ - virtual int onSeek(uint64_t offset) = 0; + virtual int onSeek(int64_t offset) = 0; /** * 从文件读取一定数据 @@ -136,8 +136,8 @@ public: void closeFile(); protected: - uint64_t onTell() override; - int onSeek(uint64_t offset) override; + int64_t onTell() override; + int onSeek(int64_t offset) override; int onRead(void *data, size_t bytes) override; int onWrite(const void *data, size_t bytes) override; @@ -167,13 +167,13 @@ public: std::string getAndClearMemory(); protected: - uint64_t onTell() override; - int onSeek(uint64_t offset) override; + int64_t onTell() override; + int onSeek(int64_t offset) override; int onRead(void *data, size_t bytes) override; int onWrite(const void *data, size_t bytes) override; private: - uint64_t _offset = 0; + int64_t _offset = 0; std::string _memory; };