NuCachedSource2.cpp revision b371426ce4cf2fa6d8c3d1903b61322feb165d35
15994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber/*
25994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * Copyright (C) 2010 The Android Open Source Project
35994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber *
45994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * you may not use this file except in compliance with the License.
65994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * You may obtain a copy of the License at
75994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber *
85994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
95994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber *
105994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * Unless required by applicable law or agreed to in writing, software
115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * See the License for the specific language governing permissions and
145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber * limitations under the License.
155994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber */
165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
175994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#define LOG_TAG "NuCachedSource2"
185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <utils/Log.h>
195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include "include/NuCachedSource2.h"
215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <media/stagefright/foundation/ADebug.h>
235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <media/stagefright/foundation/AMessage.h>
245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <media/stagefright/MediaErrors.h>
255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
265994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubernamespace android {
275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberstruct PageCache {
295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    PageCache(size_t pageSize);
305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    ~PageCache();
315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    struct Page {
335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        void *mData;
345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        size_t mSize;
355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    };
365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Page *acquirePage();
385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    void releasePage(Page *page);
395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    void appendPage(Page *page);
415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t releaseFromStart(size_t maxBytes);
425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t totalSize() const {
445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return mTotalSize;
455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    void copy(size_t from, void *data, size_t size);
485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberprivate:
505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t mPageSize;
515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t mTotalSize;
525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    List<Page *> mActivePages;
545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    List<Page *> mFreePages;
555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    void freePages(List<Page *> *list);
575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PageCache);
595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber};
605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
615994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberPageCache::PageCache(size_t pageSize)
625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    : mPageSize(pageSize),
635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mTotalSize(0) {
645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
665994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberPageCache::~PageCache() {
675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    freePages(&mActivePages);
685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    freePages(&mFreePages);
695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
715994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::freePages(List<Page *> *list) {
725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    List<Page *>::iterator it = list->begin();
735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    while (it != list->end()) {
745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        Page *page = *it;
755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
765994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        free(page->mData);
775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        delete page;
785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        page = NULL;
795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        ++it;
815994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
825994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
845994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberPageCache::Page *PageCache::acquirePage() {
855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (!mFreePages.empty()) {
865994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        List<Page *>::iterator it = mFreePages.begin();
875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        Page *page = *it;
885994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mFreePages.erase(it);
895994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return page;
915994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Page *page = new Page;
945994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    page->mData = malloc(mPageSize);
955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    page->mSize = 0;
965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return page;
985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
995994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1005994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::releasePage(Page *page) {
1015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    page->mSize = 0;
1025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mFreePages.push_back(page);
1035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
1045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1055994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::appendPage(Page *page) {
1065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mTotalSize += page->mSize;
1075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mActivePages.push_back(page);
1085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
1095994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1105994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubersize_t PageCache::releaseFromStart(size_t maxBytes) {
1115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t bytesReleased = 0;
1125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    while (maxBytes > 0 && !mActivePages.empty()) {
1145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        List<Page *>::iterator it = mActivePages.begin();
1155994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        Page *page = *it;
1175994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        if (maxBytes < page->mSize) {
1195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            break;
1205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        }
1215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mActivePages.erase(it);
1235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        maxBytes -= page->mSize;
1255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        bytesReleased += page->mSize;
1265994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        releasePage(page);
1285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
1295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mTotalSize -= bytesReleased;
1315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return bytesReleased;
1325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
1335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1345994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::copy(size_t from, void *data, size_t size) {
1356e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("copy from %d size %d", from, size);
1365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK_LE(from + size, mTotalSize);
1385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t offset = 0;
1405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    List<Page *>::iterator it = mActivePages.begin();
1415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    while (from >= offset + (*it)->mSize) {
1425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        offset += (*it)->mSize;
1435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        ++it;
1445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
1455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t delta = from - offset;
1475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t avail = (*it)->mSize - delta;
1485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (avail >= size) {
1505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        memcpy(data, (const uint8_t *)(*it)->mData + delta, size);
1515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return;
1525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
1535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    memcpy(data, (const uint8_t *)(*it)->mData + delta, avail);
1555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    ++it;
1565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    data = (uint8_t *)data + avail;
1575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size -= avail;
1585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    while (size > 0) {
1605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        size_t copy = (*it)->mSize;
1615994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        if (copy > size) {
1625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            copy = size;
1635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        }
1645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        memcpy(data, (*it)->mData, copy);
1655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        data = (uint8_t *)data + copy;
1665994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        size -= copy;
1675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        ++it;
1685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
1695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
1705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1715994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber////////////////////////////////////////////////////////////////////////////////
1725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1735994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberNuCachedSource2::NuCachedSource2(const sp<DataSource> &source)
1745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    : mSource(source),
1755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mReflector(new AHandlerReflector<NuCachedSource2>(this)),
1765994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mLooper(new ALooper),
1775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mCache(new PageCache(kPageSize)),
1785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mCacheOffset(0),
1795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mFinalStatus(OK),
1805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber      mLastAccessPos(0),
181a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber      mFetching(true),
182bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mLastFetchTimeUs(-1),
183bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber      mSuspended(false) {
184a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    mLooper->setName("NuCachedSource2");
1855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mLooper->registerHandler(mReflector);
1865994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mLooper->start();
1875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1885994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
1895994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    (new AMessage(kWhatFetchMore, mReflector->id()))->post();
1905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
1915994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1925994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberNuCachedSource2::~NuCachedSource2() {
1935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mLooper->stop();
1945994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mLooper->unregisterHandler(mReflector->id());
1955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
1965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    delete mCache;
1975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mCache = NULL;
1985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
1995994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2005994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberstatus_t NuCachedSource2::initCheck() const {
2015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return mSource->initCheck();
2025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
2035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberstatus_t NuCachedSource2::getSize(off_t *size) {
2055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return mSource->getSize(size);
2065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
2075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberuint32_t NuCachedSource2::flags() {
209bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    return (mSource->flags() & ~kWantsPrefetching) | kIsCachingDataSource;
2105994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
2115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2125994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::onMessageReceived(const sp<AMessage> &msg) {
2135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    switch (msg->what()) {
2145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        case kWhatFetchMore:
2155994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        {
2165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            onFetch();
2175994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            break;
2185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        }
2195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        case kWhatRead:
2215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        {
2225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            onRead(msg);
2235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            break;
2245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        }
2255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
226bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        case kWhatSuspend:
227bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        {
228bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber            onSuspend();
229bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber            break;
230bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        }
231bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
2325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        default:
2335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            TRESPASS();
2345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
2355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
2365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2375994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::fetchInternal() {
2386e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("fetchInternal");
2395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK_EQ(mFinalStatus, (status_t)OK);
2415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    PageCache::Page *page = mCache->acquirePage();
2435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    ssize_t n = mSource->readAt(
2455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            mCacheOffset + mCache->totalSize(), page->mData, kPageSize);
2465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
2485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (n < 0) {
2506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        LOGE("source returned error %ld", n);
2515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mFinalStatus = n;
2525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCache->releasePage(page);
2535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    } else if (n == 0) {
2546e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        LOGI("ERROR_END_OF_STREAM");
2555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mFinalStatus = ERROR_END_OF_STREAM;
2565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCache->releasePage(page);
2575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    } else {
2585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        page->mSize = n;
2595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCache->appendPage(page);
2605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
2615994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
2625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2635994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::onFetch() {
2646e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("onFetch");
2655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2665994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (mFinalStatus != OK) {
2676e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber        LOGV("EOS reached, done prefetching for now");
2685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mFetching = false;
2695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
2705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
271a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber    bool keepAlive =
272a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber        !mFetching
273bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber            && !mSuspended
274a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber            && mFinalStatus == OK
275a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber            && ALooper::GetNowUs() >= mLastFetchTimeUs + kKeepAliveIntervalUs;
276a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber
277a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber    if (mFetching || keepAlive) {
278a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber        if (keepAlive) {
2796e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            LOGI("Keep alive");
280a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber        }
281a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber
2825994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        fetchInternal();
2835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
284a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber        mLastFetchTimeUs = ALooper::GetNowUs();
285a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber
286a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber        if (mFetching && mCache->totalSize() >= kHighWaterThreshold) {
2876e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber            LOGI("Cache full, done prefetching for now");
2885994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            mFetching = false;
2895994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        }
290bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    } else if (!mSuspended) {
291d17875a226491e3de60fa32d764a4cc92de7f949Andreas Huber        Mutex::Autolock autoLock(mLock);
2925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        restartPrefetcherIfNecessary_l();
2935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
2945994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    (new AMessage(kWhatFetchMore, mReflector->id()))->post(
2965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            mFetching ? 0 : 100000ll);
2975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
2985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
2995994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::onRead(const sp<AMessage> &msg) {
3006e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("onRead");
3015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    int64_t offset;
3035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK(msg->findInt64("offset", &offset));
3045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    void *data;
3065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK(msg->findPointer("data", &data));
3075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t size;
3095994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK(msg->findSize("size", &size));
3105994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    ssize_t result = readInternal(offset, data, size);
3125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (result == -EAGAIN) {
3145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        msg->post(50000);
3155994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return;
3165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3175994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
3195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK(mAsyncResult == NULL);
3215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mAsyncResult = new AMessage;
3235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mAsyncResult->setInt32("result", result);
3245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mCondition.signal();
3265994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
3275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3285994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::restartPrefetcherIfNecessary_l() {
3295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    static const size_t kGrayArea = 256 * 1024;
3305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (mFetching || mFinalStatus != OK) {
3325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return;
3335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (mCacheOffset + mCache->totalSize() - mLastAccessPos
3365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            >= kLowWaterThreshold) {
3375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return;
3385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t maxBytes = mLastAccessPos - mCacheOffset;
3415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (maxBytes < kGrayArea) {
3425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return;
3435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    maxBytes -= kGrayArea;
3465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t actualBytes = mCache->releaseFromStart(maxBytes);
3485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mCacheOffset += actualBytes;
3495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3506e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGI("restarting prefetcher, totalSize = %d", mCache->totalSize());
3515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mFetching = true;
3525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
3535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberssize_t NuCachedSource2::readAt(off_t offset, void *data, size_t size) {
3555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoSerializer(mSerializer);
3565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3576e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("readAt offset %ld, size %d", offset, size);
3585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
3605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3615994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    // If the request can be completely satisfied from the cache, do so.
3625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (offset >= mCacheOffset
3645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            && offset + size <= mCacheOffset + mCache->totalSize()) {
3655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        size_t delta = offset - mCacheOffset;
3665994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCache->copy(delta, data, size);
3675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mLastAccessPos = offset + size;
3695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return size;
3715994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRead, mReflector->id());
3745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    msg->setInt64("offset", offset);
3755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    msg->setPointer("data", data);
3765994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    msg->setSize("size", size);
3775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK(mAsyncResult == NULL);
3795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    msg->post();
3805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3815994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    while (mAsyncResult == NULL) {
3825994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCondition.wait(mLock);
3835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3845994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    int32_t result;
3865994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK(mAsyncResult->findInt32("result", &result));
3875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3885994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mAsyncResult.clear();
3895994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (result > 0) {
3915994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mLastAccessPos = offset + result;
3925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
3935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3945994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return (ssize_t)result;
3955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
3965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
3975994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubersize_t NuCachedSource2::cachedSize() {
3985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
3995994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return mCacheOffset + mCache->totalSize();
4005994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
4015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4025994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubersize_t NuCachedSource2::approxDataRemaining(bool *eos) {
4035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
4045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return approxDataRemaining_l(eos);
4055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
4065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4075994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubersize_t NuCachedSource2::approxDataRemaining_l(bool *eos) {
4085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    *eos = (mFinalStatus != OK);
4095994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    off_t lastBytePosCached = mCacheOffset + mCache->totalSize();
4105994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (mLastAccessPos < lastBytePosCached) {
4115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return lastBytePosCached - mLastAccessPos;
4125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
4135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return 0;
4145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
4155994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberssize_t NuCachedSource2::readInternal(off_t offset, void *data, size_t size) {
4176e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("readInternal offset %ld size %d", offset, size);
4185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    Mutex::Autolock autoLock(mLock);
4205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (offset < mCacheOffset
4225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            || offset >= (off_t)(mCacheOffset + mCache->totalSize())) {
4235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        static const off_t kPadding = 32768;
4245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        // In the presence of multiple decoded streams, once of them will
4265994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        // trigger this seek request, the other one will request data "nearby"
4275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        // soon, adjust the seek position so that that subsequent request
4285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        // does not trigger another seek.
4295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        off_t seekOffset = (offset > kPadding) ? offset - kPadding : 0;
4305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        seekInternal_l(seekOffset);
4325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
4335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t delta = offset - mCacheOffset;
4355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (mFinalStatus != OK) {
4375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        if (delta >= mCache->totalSize()) {
4385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            return mFinalStatus;
4395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        }
4405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4416f5aae1bcba130d5b8092a19fca3627aa565df56Andreas Huber        size_t avail = mCache->totalSize() - delta;
4425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCache->copy(delta, data, avail);
4435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return avail;
4455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
4465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (offset + size <= mCacheOffset + mCache->totalSize()) {
4485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        mCache->copy(delta, data, size);
4495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return size;
4515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
4525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4536e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGV("deferring read");
4545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return -EAGAIN;
4565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
4575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberstatus_t NuCachedSource2::seekInternal_l(off_t offset) {
4595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mLastAccessPos = offset;
4605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4615994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    if (offset >= mCacheOffset
4625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber            && offset <= (off_t)(mCacheOffset + mCache->totalSize())) {
4635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber        return OK;
4645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    }
4655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4666e4c5c499999c04c2477b987f9e64f3ff2bf1a06Andreas Huber    LOGI("new range: offset= %ld", offset);
4675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mCacheOffset = offset;
4695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    size_t totalSize = mCache->totalSize();
4715994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    CHECK_EQ(mCache->releaseFromStart(totalSize), totalSize);
4725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mFinalStatus = OK;
4745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    mFetching = true;
4755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
4765994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber    return OK;
4775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}
4785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
479bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid NuCachedSource2::clearCacheAndResume() {
480bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    LOGV("clearCacheAndResume");
481bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
482bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Mutex::Autolock autoLock(mLock);
483bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
484bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    CHECK(mSuspended);
485bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
486bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mCacheOffset = 0;
487bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mFinalStatus = OK;
488bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mLastAccessPos = 0;
489bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mLastFetchTimeUs = -1;
490bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
491bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    size_t totalSize = mCache->totalSize();
492bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    CHECK_EQ(mCache->releaseFromStart(totalSize), totalSize);
493bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
494bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mFetching = true;
495bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mSuspended = false;
496bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
497bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
498bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid NuCachedSource2::suspend() {
499bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    (new AMessage(kWhatSuspend, mReflector->id()))->post();
500bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
501bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    while (!mSuspended) {
502bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        usleep(10000);
503bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    }
504bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
505bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
506bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Hubervoid NuCachedSource2::onSuspend() {
507bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    Mutex::Autolock autoLock(mLock);
508bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
509bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mFetching = false;
510bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber    mSuspended = true;
511bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber}
512bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
513b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangDecryptHandle* NuCachedSource2::DrmInitialization(DrmManagerClient* client) {
514b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    return mSource->DrmInitialization(client);
515b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
516b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
517b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangvoid NuCachedSource2::getDrmInfo(DecryptHandle **handle, DrmManagerClient **client) {
518b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    mSource->getDrmInfo(handle, client);
519b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang}
520b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang
5215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}  // namespace android
5225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber
523