FileSource::FileSource(int fd, int64_t offset, int64_t length) : mFd(fd), mOffset(offset), mLength(length), mName("<null>") //mDecryptHandle(NULL), //mDrmManagerClient(NULL), //mDrmBufOffset(0), //mDrmBufSize(0), //mDrmBuf(NULL) { { ALOGV("fd=%d (%s), offset=%lld, length=%lld", fd, nameForFd(fd).c_str(), (long long) offset, (long long) length); if (mOffset < 0) { mOffset = 0; } if (mLength < 0) { mLength = 0; } if (mLength > INT64_MAX - mOffset) { mLength = INT64_MAX - mOffset; } struct stat s; if (fstat(fd, &s) == 0) { if (mOffset > s.st_size) { mOffset = s.st_size; mLength = 0; } if (mOffset + mLength > s.st_size) { mLength = s.st_size - mOffset; } } if (mOffset != offset || mLength != length) { ALOGW("offset/length adjusted from %lld/%lld to %lld/%lld", (long long) offset, (long long) length, (long long) mOffset, (long long) mLength); } mName = String8::format( "FileSource(fd(%s), %lld, %lld)", nameForFd(fd).c_str(), (long long) mOffset, (long long) mLength); }
status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t length) { ALOGV("setDataSource fd=%d (%s), offset=%lld, length=%lld", fd, nameForFd(fd).c_str(), (long long) offset, (long long) length); Mutex::Autolock lock(mLock); struct stat sb; int ret = fstat(fd, &sb); if (ret != 0) { ALOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); return BAD_VALUE; } ALOGV("st_dev = %llu", static_cast<unsigned long long>(sb.st_dev)); ALOGV("st_mode = %u", sb.st_mode); ALOGV("st_uid = %lu", static_cast<unsigned long>(sb.st_uid)); ALOGV("st_gid = %lu", static_cast<unsigned long>(sb.st_gid)); ALOGV("st_size = %llu", static_cast<unsigned long long>(sb.st_size)); if (offset >= sb.st_size) { ALOGE("offset (%lld) bigger than file size (%llu)", (long long)offset, (unsigned long long)sb.st_size); return BAD_VALUE; } if (offset + length > sb.st_size) { length = sb.st_size - offset; ALOGV("calculated length = %lld", (long long)length); } player_type playerType = MediaPlayerFactory::getPlayerType(NULL /* client */, fd, offset, length); ALOGV("player type = %d", playerType); sp<MediaMetadataRetrieverBase> p = createRetriever(playerType); if (p == NULL) { return NO_INIT; } status_t status = p->setDataSource(fd, offset, length); if (status == NO_ERROR) mRetriever = p; return status; }