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