FileSource.cpp revision b371426ce4cf2fa6d8c3d1903b61322feb165d35
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/FileSource.h> 180c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber#include <media/stagefright/MediaDebug.h> 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberFileSource::FileSource(const char *filename) 2303475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber : mFile(fopen(filename, "rb")), 244e6572967da698d568a44d18797b751ec8ae5401Andreas Huber mFd(mFile == NULL ? -1 : fileno(mFile)), 2503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber mOffset(0), 26dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mLength(-1), 27dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL), 28dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient(NULL), 29dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufOffset(0), 30dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufSize(0), 31dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf(NULL){ 3203475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber} 3303475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 3403475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas HuberFileSource::FileSource(int fd, int64_t offset, int64_t length) 3503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber : mFile(fdopen(fd, "rb")), 36dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mFd(fd), 3703475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber mOffset(offset), 38dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mLength(length), 39dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL), 40dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient(NULL), 41dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufOffset(0), 42dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufSize(0), 43dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf(NULL){ 4403475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber CHECK(offset >= 0); 4503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber CHECK(length >= 0); 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberFileSource::~FileSource() { 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (mFile != NULL) { 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber fclose(mFile); 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mFile = NULL; 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 53dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 54dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBuf != NULL) { 55dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang delete[] mDrmBuf; 56dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf = NULL; 57dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6034769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huberstatus_t FileSource::initCheck() const { 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mFile != NULL ? OK : NO_INIT; 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6434769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huberssize_t FileSource::readAt(off_t offset, void *data, size_t size) { 653d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber if (mFile == NULL) { 663d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber return NO_INIT; 673d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber } 683d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7103475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber if (mLength >= 0) { 7203475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber if (offset >= mLength) { 7303475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber return 0; // read beyond EOF. 7403475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 7503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber int64_t numAvailable = mLength - offset; 7603475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber if ((int64_t)size > numAvailable) { 7703475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber size = numAvailable; 7803475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 7903475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 8003475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 81dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL && DecryptApiType::CONTAINER_BASED 82dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang == mDecryptHandle->decryptApiType) { 83dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return readAtDRM(offset, data, size); 84dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else { 85dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang int err = fseeko(mFile, offset + mOffset, SEEK_SET); 86dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (err < 0) { 87dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang LOGE("seek to %lld failed", offset + mOffset); 88dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return UNKNOWN_ERROR; 89dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 91dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return fread(data, 1, size, mFile); 92dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 9303475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber} 9403475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 9503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huberstatus_t FileSource::getSize(off_t *size) { 963d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber if (mFile == NULL) { 973d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber return NO_INIT; 983d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber } 993d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber 10003475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber if (mLength >= 0) { 10103475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber *size = mLength; 10203475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 10303475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber return OK; 10403475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 10503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 106d912f4646ece79832f9d852b39eb6b0d836ccfc4Andreas Huber fseek(mFile, 0, SEEK_END); 10703475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber *size = ftello(mFile); 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10903475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber return OK; 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 112dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria WangDecryptHandle* FileSource::DrmInitialization(DrmManagerClient* client) { 113b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (client == NULL) { 114b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 115b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 116dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = client; 117b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 118dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle == NULL) { 119dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = mDrmManagerClient->openDecryptSession( 120dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mFd, mOffset, mLength); 121dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 122dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 123dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle == NULL) { 124dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 125dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 126dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 127dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return mDecryptHandle; 128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang} 129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 130dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wangvoid FileSource::getDrmInfo(DecryptHandle **handle, DrmManagerClient **client) { 131dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang *handle = mDecryptHandle; 132dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 133dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang *client = mDrmManagerClient; 134dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang} 135dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 136dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wangssize_t FileSource::readAtDRM(off_t offset, void *data, size_t size) { 137dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang size_t DRM_CACHE_SIZE = 1024; 138dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBuf == NULL) { 139dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf = new unsigned char[DRM_CACHE_SIZE]; 140dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 141dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 142dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBuf != NULL && mDrmBufSize > 0 && (offset + mOffset) >= mDrmBufOffset 143dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang && (offset + mOffset + size) <= (mDrmBufOffset + mDrmBufSize)) { 144dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang /* Use buffered data */ 145dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang memcpy(data, (void*)(mDrmBuf+(offset+mOffset-mDrmBufOffset)), size); 146dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return size; 147dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else if (size <= DRM_CACHE_SIZE) { 148dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang /* Buffer new data */ 149dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufOffset = offset + mOffset; 150dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufSize = mDrmManagerClient->pread(mDecryptHandle, mDrmBuf, 151dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang DRM_CACHE_SIZE, offset + mOffset); 152dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBufSize > 0) { 153dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang int64_t dataRead = 0; 154dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang dataRead = size > mDrmBufSize ? mDrmBufSize : size; 155dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang memcpy(data, (void*)mDrmBuf, dataRead); 156dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return dataRead; 157dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else { 158dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return mDrmBufSize; 159dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 160dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else { 161dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang /* Too big chunk to cache. Call DRM directly */ 162dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return mDrmManagerClient->pread(mDecryptHandle, data, size, offset + mOffset); 163dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 164dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang} 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 166