diff options
author | Andreas Huber <andih@google.com> | 2009-11-16 15:34:01 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2009-11-17 10:21:03 -0800 |
commit | 744043fcbf48c32c2051f222eca552fa2df5dfcb (patch) | |
tree | bc84dc8cc46fe0b7a7b9ec21228eaf040d3152bb /media/libstagefright/FileSource.cpp | |
parent | 8c808187249f473702e0f4bee2147da292490963 (diff) | |
download | frameworks_base-744043fcbf48c32c2051f222eca552fa2df5dfcb.zip frameworks_base-744043fcbf48c32c2051f222eca552fa2df5dfcb.tar.gz frameworks_base-744043fcbf48c32c2051f222eca552fa2df5dfcb.tar.bz2 |
Update FileSource to also accept a file descriptor and a range.
Diffstat (limited to 'media/libstagefright/FileSource.cpp')
-rw-r--r-- | media/libstagefright/FileSource.cpp | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp index f318ee3..130239e 100644 --- a/media/libstagefright/FileSource.cpp +++ b/media/libstagefright/FileSource.cpp @@ -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() { @@ -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 |