FileSource.cpp revision d49dbd6b625cddb82f3f7bbeac62d48ef338ef0f
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 174f82a25c07c3ffc8d44d61797043f9864058afdfMarco Nelissen//#define LOG_NDEBUG 0 184f82a25c07c3ffc8d44d61797043f9864058afdfMarco Nelissen#define LOG_TAG "FileSource" 194f82a25c07c3ffc8d44d61797043f9864058afdfMarco Nelissen#include <utils/Log.h> 204f82a25c07c3ffc8d44d61797043f9864058afdfMarco Nelissen 21f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/FileSource.h> 2383b0fd9997b558f6c2ebf5e6e4db20570cb233b8Marco Nelissen#include <media/stagefright/Utils.h> 24d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#include <private/android_filesystem_config.h> 25c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong#include <sys/types.h> 26c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong#include <unistd.h> 27674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong#include <sys/types.h> 28674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong#include <sys/stat.h> 29674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong#include <fcntl.h> 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberFileSource::FileSource(const char *filename) 34674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong : mFd(-1), 3503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber mOffset(0), 36dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mLength(-1), 3769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen mName("<null>"), 38dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL), 39dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient(NULL), 40dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufOffset(0), 41dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufSize(0), 42dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf(NULL){ 43674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong 4469d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen if (filename) { 4569d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen mName = String8::format("FileSource(%s)", filename); 4669d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen } 4783b0fd9997b558f6c2ebf5e6e4db20570cb233b8Marco Nelissen ALOGV("%s", filename); 48674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong mFd = open(filename, O_LARGEFILE | O_RDONLY); 494ee31e2603b4019e4ae76e027115f80b818527aaAndreas Huber 504ee31e2603b4019e4ae76e027115f80b818527aaAndreas Huber if (mFd >= 0) { 514ee31e2603b4019e4ae76e027115f80b818527aaAndreas Huber mLength = lseek64(mFd, 0, SEEK_END); 52f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber } else { 53f4b7d94062c896dca565d849c6188cd3489be257Andreas Huber ALOGE("Failed to open file '%s'. (%s)", filename, strerror(errno)); 544ee31e2603b4019e4ae76e027115f80b818527aaAndreas Huber } 5503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber} 5603475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 5703475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas HuberFileSource::FileSource(int fd, int64_t offset, int64_t length) 58674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong : mFd(fd), 5903475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber mOffset(offset), 60dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mLength(length), 6169d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen mName("<null>"), 62dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle(NULL), 63dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient(NULL), 64dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufOffset(0), 65dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufSize(0), 6663690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mDrmBuf(NULL) { 6783b0fd9997b558f6c2ebf5e6e4db20570cb233b8Marco Nelissen ALOGV("fd=%d (%s), offset=%lld, length=%lld", 6883b0fd9997b558f6c2ebf5e6e4db20570cb233b8Marco Nelissen fd, nameForFd(fd).c_str(), (long long) offset, (long long) length); 6983b0fd9997b558f6c2ebf5e6e4db20570cb233b8Marco Nelissen 7063690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (mOffset < 0) { 7163690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mOffset = 0; 7263690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 7363690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (mLength < 0) { 7463690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mLength = 0; 7563690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 7663690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (mLength > INT64_MAX - mOffset) { 7763690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mLength = INT64_MAX - mOffset; 7863690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 7963690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen struct stat s; 8063690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (fstat(fd, &s) == 0) { 8163690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (mOffset > s.st_size) { 8263690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mOffset = s.st_size; 8363690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mLength = 0; 8463690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 8563690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (mOffset + mLength > s.st_size) { 8663690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen mLength = s.st_size - mOffset; 8763690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 8863690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 8963690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen if (mOffset != offset || mLength != length) { 9063690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen ALOGW("offset/length adjusted from %lld/%lld to %lld/%lld", 9163690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen (long long) offset, (long long) length, 9263690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen (long long) mOffset, (long long) mLength); 9363690d1588cb24929da7ced24ec341ed2a003825Marco Nelissen } 9469d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen 9569d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen mName = String8::format( 9669d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen "FileSource(fd(%s), %lld, %lld)", 9769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen nameForFd(fd).c_str(), 9869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen (long long) mOffset, 9969d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen (long long) mLength); 10069d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberFileSource::~FileSource() { 104674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong if (mFd >= 0) { 105fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen ::close(mFd); 106674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong mFd = -1; 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 108dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 109dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBuf != NULL) { 110dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang delete[] mDrmBuf; 111dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf = NULL; 112dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 113889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang 114889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang if (mDecryptHandle != NULL) { 115889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang // To release mDecryptHandle 1168f64134f749e4f7861a08a3063450fc714c4651dGloria Wang CHECK(mDrmManagerClient); 117889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang mDrmManagerClient->closeDecryptSession(mDecryptHandle); 118889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang mDecryptHandle = NULL; 119889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang } 120889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang 121889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang if (mDrmManagerClient != NULL) { 122889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang delete mDrmManagerClient; 123889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang mDrmManagerClient = NULL; 124889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang } 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12734769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huberstatus_t FileSource::initCheck() const { 128674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong return mFd >= 0 ? OK : NO_INIT; 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 131c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongssize_t FileSource::readAt(off64_t offset, void *data, size_t size) { 132674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong if (mFd < 0) { 1333d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber return NO_INIT; 1343d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber } 1353d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber Mutex::Autolock autoLock(mLock); 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13803475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber if (mLength >= 0) { 13903475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber if (offset >= mLength) { 14003475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber return 0; // read beyond EOF. 14103475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 1420eaf820756bf584284f246b6ba79968efbd08fafWei Jia uint64_t numAvailable = mLength - offset; 1430eaf820756bf584284f246b6ba79968efbd08fafWei Jia if ((uint64_t)size > numAvailable) { 14403475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber size = numAvailable; 14503475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 14603475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber } 14703475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 148dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle != NULL && DecryptApiType::CONTAINER_BASED 149dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang == mDecryptHandle->decryptApiType) { 150dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return readAtDRM(offset, data, size); 151dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else { 152c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t result = lseek64(mFd, offset + mOffset, SEEK_SET); 153c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong if (result == -1) { 154ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGE("seek to %lld failed", (long long)(offset + mOffset)); 155dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return UNKNOWN_ERROR; 156dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 158c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong return ::read(mFd, data, size); 159dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 16003475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber} 16103475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber 162c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t FileSource::getSize(off64_t *size) { 1633a13fad63af40a8364fce796b1a54a8f0a2fbf32Andreas Huber Mutex::Autolock autoLock(mLock); 1643a13fad63af40a8364fce796b1a54a8f0a2fbf32Andreas Huber 165674ebd0b4e1143e38392a4e3bb38b4679a4577bcJames Dong if (mFd < 0) { 1663d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber return NO_INIT; 1673d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber } 1683d8055ac96170de7a8c49b9ffbe83ed447ccddceAndreas Huber 1694ee31e2603b4019e4ae76e027115f80b818527aaAndreas Huber *size = mLength; 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17103475f5af25e4aa32d46d41dd2ec756853d8dd9dAndreas Huber return OK; 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1749d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongsp<DecryptHandle> FileSource::DrmInitialization(const char *mime) { 175d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung if (getuid() == AID_MEDIA_EX) return nullptr; // no DRM in media extractor 176889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang if (mDrmManagerClient == NULL) { 177889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang mDrmManagerClient = new DrmManagerClient(); 178889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang } 179889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang 180889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang if (mDrmManagerClient == NULL) { 181b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 182b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 183b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 184dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle == NULL) { 185dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDecryptHandle = mDrmManagerClient->openDecryptSession( 1869d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong mFd, mOffset, mLength, mime); 187dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 188dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 189dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDecryptHandle == NULL) { 190889b340ec736a9d3e3e690256d305cc8740f0c4bGloria Wang delete mDrmManagerClient; 191dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmManagerClient = NULL; 192dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 193dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 194dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return mDecryptHandle; 195dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang} 196dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 197b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangvoid FileSource::getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) { 198b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang handle = mDecryptHandle; 199dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 200dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang *client = mDrmManagerClient; 201dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang} 202dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 203c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongssize_t FileSource::readAtDRM(off64_t offset, void *data, size_t size) { 204dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang size_t DRM_CACHE_SIZE = 1024; 205dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBuf == NULL) { 206dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBuf = new unsigned char[DRM_CACHE_SIZE]; 207dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 208dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang 209dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBuf != NULL && mDrmBufSize > 0 && (offset + mOffset) >= mDrmBufOffset 210d066bc8faf68b9fcb034ceb203e8d7e8213dc1cePatrik Lindgren && (offset + mOffset + size) <= static_cast<size_t>(mDrmBufOffset + mDrmBufSize)) { 211dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang /* Use buffered data */ 212dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang memcpy(data, (void*)(mDrmBuf+(offset+mOffset-mDrmBufOffset)), size); 213dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return size; 214dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else if (size <= DRM_CACHE_SIZE) { 215dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang /* Buffer new data */ 216dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufOffset = offset + mOffset; 217dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang mDrmBufSize = mDrmManagerClient->pread(mDecryptHandle, mDrmBuf, 218dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang DRM_CACHE_SIZE, offset + mOffset); 219dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang if (mDrmBufSize > 0) { 220dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang int64_t dataRead = 0; 221d066bc8faf68b9fcb034ceb203e8d7e8213dc1cePatrik Lindgren dataRead = size > static_cast<size_t>(mDrmBufSize) ? mDrmBufSize : size; 222dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang memcpy(data, (void*)mDrmBuf, dataRead); 223dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return dataRead; 224dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else { 225dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return mDrmBufSize; 226dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 227dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } else { 228dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang /* Too big chunk to cache. Call DRM directly */ 229dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang return mDrmManagerClient->pread(mDecryptHandle, data, size, offset + mOffset); 230dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang } 231dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang} 232d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 233d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung/* static */ 234d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hungbool FileSource::requiresDrm(int fd, int64_t offset, int64_t length, const char *mime) { 235d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung std::unique_ptr<DrmManagerClient> drmClient(new DrmManagerClient()); 236d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung sp<DecryptHandle> decryptHandle = 237d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung drmClient->openDecryptSession(fd, offset, length, mime); 238d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung bool requiresDrm = false; 239d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung if (decryptHandle != nullptr) { 240d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung requiresDrm = decryptHandle->decryptApiType == DecryptApiType::CONTAINER_BASED; 241d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung drmClient->closeDecryptSession(decryptHandle); 242d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 243d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return requiresDrm; 244d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung} 245d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 247