From 744043fcbf48c32c2051f222eca552fa2df5dfcb Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 16 Nov 2009 15:34:01 -0800 Subject: Update FileSource to also accept a file descriptor and a range. --- media/libstagefright/FileSource.cpp | 39 +++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) (limited to 'media') 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 -- cgit v1.1