Loading include/media/stagefright/FileSource.h +5 −0 Original line number Diff line number Diff line Loading @@ -29,16 +29,21 @@ namespace android { class FileSource : public DataSource { public: FileSource(const char *filename); FileSource(int fd, int64_t offset, int64_t length); virtual status_t initCheck() const; virtual ssize_t readAt(off_t offset, void *data, size_t size); virtual status_t getSize(off_t *size); protected: virtual ~FileSource(); private: FILE *mFile; int64_t mOffset; int64_t mLength; Mutex mLock; FileSource(const FileSource &); Loading media/libstagefright/FileSource.cpp +35 −4 Original line number Diff line number Diff line Loading @@ -20,7 +20,17 @@ namespace android { FileSource::FileSource(const char *filename) : mFile(fopen(filename, "rb")) { : mFile(fopen(filename, "rb")), mOffset(0), mLength(-1) { } FileSource::FileSource(int fd, int64_t offset, int64_t length) : mFile(fdopen(fd, "rb")), mOffset(offset), mLength(length) { CHECK(offset >= 0); CHECK(length >= 0); } FileSource::~FileSource() { Loading @@ -37,12 +47,33 @@ status_t FileSource::initCheck() const { ssize_t FileSource::readAt(off_t offset, void *data, size_t size) { Mutex::Autolock autoLock(mLock); int err = fseeko(mFile, offset, SEEK_SET); if (mLength >= 0) { if (offset >= mLength) { return 0; // read beyond EOF. } int64_t numAvailable = mLength - offset; if ((int64_t)size > numAvailable) { size = numAvailable; } } int err = fseeko(mFile, offset + mOffset, SEEK_SET); CHECK(err != -1); ssize_t result = fread(data, 1, size, mFile); return fread(data, 1, size, mFile); } status_t FileSource::getSize(off_t *size) { if (mLength >= 0) { *size = mLength; return OK; } fseek(mFile, SEEK_END, 0); *size = ftello(mFile); return result; return OK; } } // namespace android Loading
include/media/stagefright/FileSource.h +5 −0 Original line number Diff line number Diff line Loading @@ -29,16 +29,21 @@ namespace android { class FileSource : public DataSource { public: FileSource(const char *filename); FileSource(int fd, int64_t offset, int64_t length); virtual status_t initCheck() const; virtual ssize_t readAt(off_t offset, void *data, size_t size); virtual status_t getSize(off_t *size); protected: virtual ~FileSource(); private: FILE *mFile; int64_t mOffset; int64_t mLength; Mutex mLock; FileSource(const FileSource &); Loading
media/libstagefright/FileSource.cpp +35 −4 Original line number Diff line number Diff line Loading @@ -20,7 +20,17 @@ namespace android { FileSource::FileSource(const char *filename) : mFile(fopen(filename, "rb")) { : mFile(fopen(filename, "rb")), mOffset(0), mLength(-1) { } FileSource::FileSource(int fd, int64_t offset, int64_t length) : mFile(fdopen(fd, "rb")), mOffset(offset), mLength(length) { CHECK(offset >= 0); CHECK(length >= 0); } FileSource::~FileSource() { Loading @@ -37,12 +47,33 @@ status_t FileSource::initCheck() const { ssize_t FileSource::readAt(off_t offset, void *data, size_t size) { Mutex::Autolock autoLock(mLock); int err = fseeko(mFile, offset, SEEK_SET); if (mLength >= 0) { if (offset >= mLength) { return 0; // read beyond EOF. } int64_t numAvailable = mLength - offset; if ((int64_t)size > numAvailable) { size = numAvailable; } } int err = fseeko(mFile, offset + mOffset, SEEK_SET); CHECK(err != -1); ssize_t result = fread(data, 1, size, mFile); return fread(data, 1, size, mFile); } status_t FileSource::getSize(off_t *size) { if (mLength >= 0) { *size = mLength; return OK; } fseek(mFile, SEEK_END, 0); *size = ftello(mFile); return result; return OK; } } // namespace android