summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/FileSource.cpp
diff options
context:
space:
mode:
authorGloria Wang <gwang@google.com>2010-10-25 15:23:04 -0700
committerGloria Wang <gwang@google.com>2010-10-25 16:11:18 -0700
commita9741a9232c81eaf59179acef91f5be46c42264e (patch)
tree9a66416b42a28ec2ad4fa2ec520c42d976046aec /media/libstagefright/FileSource.cpp
parentd8cba5371423841e6a85816ad4a7fd88d3a60b12 (diff)
parentdcd25efb46c41c8d24a0a9cf61fb57f84149709e (diff)
downloadframeworks_av-a9741a9232c81eaf59179acef91f5be46c42264e.zip
frameworks_av-a9741a9232c81eaf59179acef91f5be46c42264e.tar.gz
frameworks_av-a9741a9232c81eaf59179acef91f5be46c42264e.tar.bz2
resolved conflicts for merge of 9084631d to gingerbread-plus-aosp
Change-Id: Ie2b675d50bfca3f33aee80f1a67c9f03d1f97472
Diffstat (limited to 'media/libstagefright/FileSource.cpp')
-rw-r--r--media/libstagefright/FileSource.cpp90
1 files changed, 82 insertions, 8 deletions
diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp
index dd2579b..b46d8d0 100644
--- a/media/libstagefright/FileSource.cpp
+++ b/media/libstagefright/FileSource.cpp
@@ -21,14 +21,26 @@ namespace android {
FileSource::FileSource(const char *filename)
: mFile(fopen(filename, "rb")),
+ mFd(fileno(mFile)),
mOffset(0),
- mLength(-1) {
+ mLength(-1),
+ mDecryptHandle(NULL),
+ mDrmManagerClient(NULL),
+ mDrmBufOffset(0),
+ mDrmBufSize(0),
+ mDrmBuf(NULL){
}
FileSource::FileSource(int fd, int64_t offset, int64_t length)
: mFile(fdopen(fd, "rb")),
+ mFd(fd),
mOffset(offset),
- mLength(length) {
+ mLength(length),
+ mDecryptHandle(NULL),
+ mDrmManagerClient(NULL),
+ mDrmBufOffset(0),
+ mDrmBufSize(0),
+ mDrmBuf(NULL){
CHECK(offset >= 0);
CHECK(length >= 0);
}
@@ -38,6 +50,14 @@ FileSource::~FileSource() {
fclose(mFile);
mFile = NULL;
}
+
+ if (mDrmBuf != NULL) {
+ delete[] mDrmBuf;
+ mDrmBuf = NULL;
+ }
+ if (mDecryptHandle != NULL) {
+ mDrmManagerClient->closeDecryptSession(mDecryptHandle);
+ }
}
status_t FileSource::initCheck() const {
@@ -61,13 +81,18 @@ ssize_t FileSource::readAt(off_t offset, void *data, size_t size) {
}
}
- int err = fseeko(mFile, offset + mOffset, SEEK_SET);
- if (err < 0) {
- LOGE("seek to %lld failed", offset + mOffset);
- return UNKNOWN_ERROR;
- }
+ if (mDecryptHandle != NULL && DecryptApiType::CONTAINER_BASED
+ == mDecryptHandle->decryptApiType) {
+ return readAtDRM(offset, data, size);
+ } else {
+ int err = fseeko(mFile, offset + mOffset, SEEK_SET);
+ if (err < 0) {
+ LOGE("seek to %lld failed", offset + mOffset);
+ return UNKNOWN_ERROR;
+ }
- return fread(data, 1, size, mFile);
+ return fread(data, 1, size, mFile);
+ }
}
status_t FileSource::getSize(off_t *size) {
@@ -87,4 +112,53 @@ status_t FileSource::getSize(off_t *size) {
return OK;
}
+DecryptHandle* FileSource::DrmInitialization(DrmManagerClient* client) {
+ mDrmManagerClient = client;
+ if (mDecryptHandle == NULL) {
+ mDecryptHandle = mDrmManagerClient->openDecryptSession(
+ mFd, mOffset, mLength);
+ }
+
+ if (mDecryptHandle == NULL) {
+ mDrmManagerClient = NULL;
+ }
+
+ return mDecryptHandle;
+}
+
+void FileSource::getDrmInfo(DecryptHandle **handle, DrmManagerClient **client) {
+ *handle = mDecryptHandle;
+
+ *client = mDrmManagerClient;
+}
+
+ssize_t FileSource::readAtDRM(off_t offset, void *data, size_t size) {
+ size_t DRM_CACHE_SIZE = 1024;
+ if (mDrmBuf == NULL) {
+ mDrmBuf = new unsigned char[DRM_CACHE_SIZE];
+ }
+
+ if (mDrmBuf != NULL && mDrmBufSize > 0 && (offset + mOffset) >= mDrmBufOffset
+ && (offset + mOffset + size) <= (mDrmBufOffset + mDrmBufSize)) {
+ /* Use buffered data */
+ memcpy(data, (void*)(mDrmBuf+(offset+mOffset-mDrmBufOffset)), size);
+ return size;
+ } else if (size <= DRM_CACHE_SIZE) {
+ /* Buffer new data */
+ mDrmBufOffset = offset + mOffset;
+ mDrmBufSize = mDrmManagerClient->pread(mDecryptHandle, mDrmBuf,
+ DRM_CACHE_SIZE, offset + mOffset);
+ if (mDrmBufSize > 0) {
+ int64_t dataRead = 0;
+ dataRead = size > mDrmBufSize ? mDrmBufSize : size;
+ memcpy(data, (void*)mDrmBuf, dataRead);
+ return dataRead;
+ } else {
+ return mDrmBufSize;
+ }
+ } else {
+ /* Too big chunk to cache. Call DRM directly */
+ return mDrmManagerClient->pread(mDecryptHandle, data, size, offset + mOffset);
+ }
+}
} // namespace android