NuCachedSource2.cpp revision 1d15ab58bf8239069ef343de6cb21aabf3ef7d78
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 17a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn#include <inttypes.h> 18a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn 19ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber//#define LOG_NDEBUG 0 205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#define LOG_TAG "NuCachedSource2" 215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <utils/Log.h> 225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include "include/NuCachedSource2.h" 245b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong#include "include/HTTPBase.h" 255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 26a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber#include <cutils/properties.h> 275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <media/stagefright/foundation/ADebug.h> 285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <media/stagefright/foundation/AMessage.h> 295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber#include <media/stagefright/MediaErrors.h> 305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 315994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubernamespace android { 325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberstruct PageCache { 345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber PageCache(size_t pageSize); 355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ~PageCache(); 365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber struct Page { 385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber void *mData; 395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t mSize; 405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber }; 415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Page *acquirePage(); 435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber void releasePage(Page *page); 445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber void appendPage(Page *page); 465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t releaseFromStart(size_t maxBytes); 475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t totalSize() const { 495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return mTotalSize; 505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber void copy(size_t from, void *data, size_t size); 535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberprivate: 555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t mPageSize; 565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t mTotalSize; 575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber List<Page *> mActivePages; 595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber List<Page *> mFreePages; 605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 615994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber void freePages(List<Page *> *list); 625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(PageCache); 645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber}; 655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 665994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberPageCache::PageCache(size_t pageSize) 675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber : mPageSize(pageSize), 685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mTotalSize(0) { 695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 715994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberPageCache::~PageCache() { 725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber freePages(&mActivePages); 735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber freePages(&mFreePages); 745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 765994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::freePages(List<Page *> *list) { 775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber List<Page *>::iterator it = list->begin(); 785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber while (it != list->end()) { 795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Page *page = *it; 805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 815994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber free(page->mData); 825994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber delete page; 835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber page = NULL; 845994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ++it; 865994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 885994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 895994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberPageCache::Page *PageCache::acquirePage() { 905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (!mFreePages.empty()) { 915994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber List<Page *>::iterator it = mFreePages.begin(); 925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Page *page = *it; 935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFreePages.erase(it); 945994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return page; 965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Page *page = new Page; 995994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber page->mData = malloc(mPageSize); 1005994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber page->mSize = 0; 1015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return page; 1035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 1045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1055994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::releasePage(Page *page) { 1065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber page->mSize = 0; 1075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFreePages.push_back(page); 1085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 1095994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1105994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::appendPage(Page *page) { 1115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mTotalSize += page->mSize; 1125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mActivePages.push_back(page); 1135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 1145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1155994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubersize_t PageCache::releaseFromStart(size_t maxBytes) { 1165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t bytesReleased = 0; 1175994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber while (maxBytes > 0 && !mActivePages.empty()) { 1195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber List<Page *>::iterator it = mActivePages.begin(); 1205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Page *page = *it; 1225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (maxBytes < page->mSize) { 1245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber break; 1255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 1265994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mActivePages.erase(it); 1285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber maxBytes -= page->mSize; 1305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber bytesReleased += page->mSize; 1315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber releasePage(page); 1335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 1345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mTotalSize -= bytesReleased; 1365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return bytesReleased; 1375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 1385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1395994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid PageCache::copy(size_t from, void *data, size_t size) { 140a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("copy from %zu size %zu", from, size); 1415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 142310962976d575c0a97ec7a768e9cca0b2361daeaAndreas Huber if (size == 0) { 143310962976d575c0a97ec7a768e9cca0b2361daeaAndreas Huber return; 144310962976d575c0a97ec7a768e9cca0b2361daeaAndreas Huber } 145310962976d575c0a97ec7a768e9cca0b2361daeaAndreas Huber 1465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK_LE(from + size, mTotalSize); 1475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t offset = 0; 1495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber List<Page *>::iterator it = mActivePages.begin(); 1505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber while (from >= offset + (*it)->mSize) { 1515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber offset += (*it)->mSize; 1525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ++it; 1535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 1545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t delta = from - offset; 1565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t avail = (*it)->mSize - delta; 1575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (avail >= size) { 1595994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber memcpy(data, (const uint8_t *)(*it)->mData + delta, size); 1605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return; 1615994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 1625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber memcpy(data, (const uint8_t *)(*it)->mData + delta, avail); 1645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ++it; 1655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber data = (uint8_t *)data + avail; 1665994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size -= avail; 1675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber while (size > 0) { 1695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t copy = (*it)->mSize; 1705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (copy > size) { 1715994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber copy = size; 1725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 1735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber memcpy(data, (*it)->mData, copy); 1745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber data = (uint8_t *)data + copy; 1755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size -= copy; 1765994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ++it; 1775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 1785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 1795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 1805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber//////////////////////////////////////////////////////////////////////////////// 1815994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 18249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas HuberNuCachedSource2::NuCachedSource2( 18349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber const sp<DataSource> &source, 18449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber const char *cacheConfig, 18549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber bool disconnectAtHighwatermark) 1865994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber : mSource(source), 1875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mReflector(new AHandlerReflector<NuCachedSource2>(this)), 1885994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLooper(new ALooper), 1895994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache(new PageCache(kPageSize)), 1905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCacheOffset(0), 1915994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFinalStatus(OK), 1925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLastAccessPos(0), 193a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber mFetching(true), 19448296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang mDisconnecting(false), 1950683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber mLastFetchTimeUs(-1), 196a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mNumRetriesLeft(kMaxNumRetries), 197a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mHighwaterThresholdBytes(kDefaultHighWaterThreshold), 198a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mLowwaterThresholdBytes(kDefaultLowWaterThreshold), 19949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber mKeepAliveIntervalUs(kDefaultKeepAliveIntervalUs), 20049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber mDisconnectAtHighwatermark(disconnectAtHighwatermark) { 20149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber // We are NOT going to support disconnect-at-highwatermark indefinitely 20249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber // and we are not guaranteeing support for client-specified cache 20349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber // parameters. Both of these are temporary measures to solve a specific 20449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber // problem that will be solved in a better way going forward. 20549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 206a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber updateCacheParamsFromSystemProperty(); 207a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 20849c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber if (cacheConfig != NULL) { 20949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber updateCacheParamsFromString(cacheConfig); 21049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber } 21149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 21249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber if (mDisconnectAtHighwatermark) { 21349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber // Makes no sense to disconnect and do keep-alives... 21449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber mKeepAliveIntervalUs = 0; 21549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber } 21649c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 217a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber mLooper->setName("NuCachedSource2"); 2185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLooper->registerHandler(mReflector); 2191b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 2201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber // Since it may not be obvious why our looper thread needs to be 2211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber // able to call into java since it doesn't appear to do so at all... 2221b86fe063badb5f28c467ade39be0f4008688947Andreas Huber // IMediaHTTPConnection may be (and most likely is) implemented in JAVA 2231b86fe063badb5f28c467ade39be0f4008688947Andreas Huber // and a local JAVA IBinder will call directly into JNI methods. 2241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber // So whenever we call DataSource::readAt it may end up in a call to 2251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber // IMediaHTTPConnection::readAt and therefore call back into JAVA. 2261b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mLooper->start(false /* runOnCallingThread */, true /* canCallJava */); 2275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 2291d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatFetchMore, mReflector))->post(); 2305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 2315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2325994b4798b01f3dd340577c9ea9657f09093a770Andreas HuberNuCachedSource2::~NuCachedSource2() { 2335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLooper->stop(); 2345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLooper->unregisterHandler(mReflector->id()); 2355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber delete mCache; 2375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache = NULL; 2385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 2395994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2405b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t NuCachedSource2::getEstimatedBandwidthKbps(int32_t *kbps) { 241b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong if (mSource->flags() & kIsHTTPBasedSource) { 242b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong HTTPBase* source = static_cast<HTTPBase *>(mSource.get()); 243b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return source->getEstimatedBandwidthKbps(kbps); 244b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong } 245b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return ERROR_UNSUPPORTED; 2465b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 2475b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 24848296b792a8d68358de74141fa80bd5bd84d0307Chong Zhangvoid NuCachedSource2::disconnect() { 24948296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang if (mSource->flags() & kIsHTTPBasedSource) { 25048296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang ALOGV("disconnecting HTTPBasedSource"); 25148296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang 25248296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang { 25348296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang Mutex::Autolock autoLock(mLock); 25448296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang // set mDisconnecting to true, if a fetch returns after 25548296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang // this, the source will be marked as EOS. 25648296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang mDisconnecting = true; 2579f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang 2589f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang // explicitly signal mCondition so that the pending readAt() 2599f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang // will immediately return 2609f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang mCondition.signal(); 26148296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang } 26248296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang 26348296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang // explicitly disconnect from the source, to allow any 26448296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang // pending reads to return more promptly 26548296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang static_cast<HTTPBase *>(mSource.get())->disconnect(); 26648296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang } 26748296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang} 26848296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang 2695b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t NuCachedSource2::setCacheStatCollectFreq(int32_t freqMs) { 270b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong if (mSource->flags() & kIsHTTPBasedSource) { 271b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong HTTPBase *source = static_cast<HTTPBase *>(mSource.get()); 272b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return source->setBandwidthStatCollectFreq(freqMs); 273b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong } 274b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return ERROR_UNSUPPORTED; 2755b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 2765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 2775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberstatus_t NuCachedSource2::initCheck() const { 2785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return mSource->initCheck(); 2795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 2805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 281c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t NuCachedSource2::getSize(off64_t *size) { 2825994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return mSource->getSize(size); 2835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 2845994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huberuint32_t NuCachedSource2::flags() { 286b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong // Remove HTTP related flags since NuCachedSource2 is not HTTP-based. 287b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong uint32_t flags = mSource->flags() & ~(kWantsPrefetching | kIsHTTPBasedSource); 288b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong return (flags | kIsCachingDataSource); 2895994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 2905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2915994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::onMessageReceived(const sp<AMessage> &msg) { 2925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber switch (msg->what()) { 2935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber case kWhatFetchMore: 2945994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber { 2955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber onFetch(); 2965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber break; 2975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 2985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 2995994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber case kWhatRead: 3005994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber { 3015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber onRead(msg); 3025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber break; 3035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 3045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber default: 3065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber TRESPASS(); 3075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 3085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 3095994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3105994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::fetchInternal() { 3113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("fetchInternal"); 3125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 31395c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber bool reconnect = false; 31495c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber 3150683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber { 3160683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber Mutex::Autolock autoLock(mLock); 3170683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber CHECK(mFinalStatus == OK || mNumRetriesLeft > 0); 3180683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3190683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFinalStatus != OK) { 3200683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber --mNumRetriesLeft; 3210683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 32295c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber reconnect = true; 32395c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber } 32495c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber } 32595c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber 32695c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber if (reconnect) { 32795c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber status_t err = 32895c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber mSource->reconnectAtOffset(mCacheOffset + mCache->totalSize()); 32995c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber 33095c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber Mutex::Autolock autoLock(mLock); 3310683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3329f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang if (mDisconnecting) { 3339f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang mNumRetriesLeft = 0; 3349f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang mFinalStatus = ERROR_END_OF_STREAM; 3359f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang return; 3369f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang } else if (err == ERROR_UNSUPPORTED || err == -EPIPE) { 337a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber // These are errors that are not likely to go away even if we 338a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber // retry, i.e. the server doesn't support range requests or similar. 33995c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber mNumRetriesLeft = 0; 34095c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber return; 34195c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber } else if (err != OK) { 342df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("The attempt to reconnect failed, %d retries remaining", 34395c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber mNumRetriesLeft); 3440683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 34595c4d6034dc356f70c6293ea53d4858415b2d020Andreas Huber return; 3460683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 3470683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 3485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber PageCache::Page *page = mCache->acquirePage(); 3505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ssize_t n = mSource->readAt( 3525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCacheOffset + mCache->totalSize(), page->mData, kPageSize); 3535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 3555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 35648296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang if (n == 0 || mDisconnecting) { 357efbb61950db36a5eb789be83f077246172507c67Chong Zhang ALOGI("caching reached eos."); 35848296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang 35948296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang mNumRetriesLeft = 0; 36048296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang mFinalStatus = ERROR_END_OF_STREAM; 36148296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang 36248296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang mCache->releasePage(page); 36348296b792a8d68358de74141fa80bd5bd84d0307Chong Zhang } else if (n < 0) { 3645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFinalStatus = n; 365a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber if (n == ERROR_UNSUPPORTED || n == -EPIPE) { 366a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber // These are errors that are not likely to go away even if we 367a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber // retry, i.e. the server doesn't support range requests or similar. 368a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber mNumRetriesLeft = 0; 369a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber } 370a7607a7f97b3136d5e61c0bca63760bf9fc05b19Andreas Huber 371a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGE("source returned error %zd, %d retries left", n, mNumRetriesLeft); 3725994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache->releasePage(page); 3735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } else { 3740683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFinalStatus != OK) { 375df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("retrying a previously failed read succeeded."); 3760683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 3770683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber mNumRetriesLeft = kMaxNumRetries; 3780683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber mFinalStatus = OK; 3790683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 3805994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber page->mSize = n; 3815994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache->appendPage(page); 3825994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 3835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 3845994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3855994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::onFetch() { 3863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("onFetch"); 3875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 3880683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFinalStatus != OK && mNumRetriesLeft == 0) { 3893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EOS reached, done prefetching for now"); 3905994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFetching = false; 3915994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 3925994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 393a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber bool keepAlive = 394a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber !mFetching 395a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber && mFinalStatus == OK 396a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber && mKeepAliveIntervalUs > 0 397a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber && ALooper::GetNowUs() >= mLastFetchTimeUs + mKeepAliveIntervalUs; 398a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber 399a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber if (mFetching || keepAlive) { 400a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber if (keepAlive) { 401df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Keep alive"); 402a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber } 403a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber 4045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber fetchInternal(); 4055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 406a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber mLastFetchTimeUs = ALooper::GetNowUs(); 407a5273ebd1746368662a597643d6701a5046d5c7bAndreas Huber 408a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber if (mFetching && mCache->totalSize() >= mHighwaterThresholdBytes) { 409df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("Cache full, done prefetching for now"); 4105994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFetching = false; 41149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 41249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber if (mDisconnectAtHighwatermark 41349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber && (mSource->flags() & DataSource::kIsHTTPBasedSource)) { 4143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Disconnecting at high watermark"); 41549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber static_cast<HTTPBase *>(mSource.get())->disconnect(); 41640a4e1440869b2e3981f261b0d301cd16c0cf0aaBryan Mawhinney mFinalStatus = -EAGAIN; 41749c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber } 4185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 419a44153c1a57202fb538659eb50706e60454d6273Andreas Huber } else { 420d17875a226491e3de60fa32d764a4cc92de7f949Andreas Huber Mutex::Autolock autoLock(mLock); 4215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber restartPrefetcherIfNecessary_l(); 4225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 4235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4240683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber int64_t delayUs; 4250683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFetching) { 4260683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFinalStatus != OK && mNumRetriesLeft > 0) { 4270683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber // We failed this time and will try again in 3 seconds. 4280683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber delayUs = 3000000ll; 4290683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } else { 4300683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber delayUs = 0; 4310683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 4320683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } else { 4330683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber delayUs = 100000ll; 4340683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 4350683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 4361d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatFetchMore, mReflector))->post(delayUs); 4375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 4385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4395994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubervoid NuCachedSource2::onRead(const sp<AMessage> &msg) { 4403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("onRead"); 4415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber int64_t offset; 4435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK(msg->findInt64("offset", &offset)); 4445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber void *data; 4465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK(msg->findPointer("data", &data)); 4475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t size; 4495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK(msg->findSize("size", &size)); 4505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber ssize_t result = readInternal(offset, data, size); 4525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (result == -EAGAIN) { 4545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber msg->post(50000); 4555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return; 4565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 4575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 4594f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih if (mDisconnecting) { 4604f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih mCondition.signal(); 4614f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih return; 4624f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih } 4635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4645994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK(mAsyncResult == NULL); 4655994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4665994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mAsyncResult = new AMessage; 4675994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mAsyncResult->setInt32("result", result); 4685994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4695994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCondition.signal(); 4705994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 4715994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 47234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid NuCachedSource2::restartPrefetcherIfNecessary_l( 4737bf8413f91fc072452f315a91618aeef2574d420Andreas Huber bool ignoreLowWaterThreshold, bool force) { 4746ee94582e3ce7bdd9625345e7564e3176a51a2f3James Dong static const size_t kGrayArea = 1024 * 1024; 4755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4760683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFetching || (mFinalStatus != OK && mNumRetriesLeft == 0)) { 4775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return; 4785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 4795994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4807bf8413f91fc072452f315a91618aeef2574d420Andreas Huber if (!ignoreLowWaterThreshold && !force 48134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber && mCacheOffset + mCache->totalSize() - mLastAccessPos 482a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber >= mLowwaterThresholdBytes) { 4835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return; 4845994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 4855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4865994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t maxBytes = mLastAccessPos - mCacheOffset; 4875994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4887bf8413f91fc072452f315a91618aeef2574d420Andreas Huber if (!force) { 4897bf8413f91fc072452f315a91618aeef2574d420Andreas Huber if (maxBytes < kGrayArea) { 4907bf8413f91fc072452f315a91618aeef2574d420Andreas Huber return; 4917bf8413f91fc072452f315a91618aeef2574d420Andreas Huber } 4927bf8413f91fc072452f315a91618aeef2574d420Andreas Huber 4937bf8413f91fc072452f315a91618aeef2574d420Andreas Huber maxBytes -= kGrayArea; 4947bf8413f91fc072452f315a91618aeef2574d420Andreas Huber } 4955994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 4965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t actualBytes = mCache->releaseFromStart(maxBytes); 4975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCacheOffset += actualBytes; 4985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 499a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGI("restarting prefetcher, totalSize = %zu", mCache->totalSize()); 5005994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFetching = true; 5015994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 5025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 503c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongssize_t NuCachedSource2::readAt(off64_t offset, void *data, size_t size) { 5045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoSerializer(mSerializer); 5055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 506a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("readAt offset %lld, size %zu", offset, size); 5075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5085994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 5094f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih if (mDisconnecting) { 5104f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih return ERROR_END_OF_STREAM; 5114f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih } 5125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5135994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber // If the request can be completely satisfied from the cache, do so. 5145994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5155994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (offset >= mCacheOffset 5165994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber && offset + size <= mCacheOffset + mCache->totalSize()) { 5175994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t delta = offset - mCacheOffset; 5185994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache->copy(delta, data, size); 5195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLastAccessPos = offset + size; 5215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return size; 5235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 5245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5251d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatRead, mReflector); 5265994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber msg->setInt64("offset", offset); 5275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber msg->setPointer("data", data); 5285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber msg->setSize("size", size); 5295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5305994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK(mAsyncResult == NULL); 5315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber msg->post(); 5325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5339f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang while (mAsyncResult == NULL && !mDisconnecting) { 5345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCondition.wait(mLock); 5355994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 5365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5379f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang if (mDisconnecting) { 5384f17dadd3cfd9940893ea042ca8883c6aa6ada07Robert Shih mAsyncResult.clear(); 5399f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang return ERROR_END_OF_STREAM; 5409f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang } 5419f3d1cffe3bbec35c1fb7fc7e206428728ac234eChong Zhang 5425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber int32_t result; 5435994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK(mAsyncResult->findInt32("result", &result)); 5445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mAsyncResult.clear(); 5465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (result > 0) { 5485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLastAccessPos = offset + result; 5495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 5505994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return (ssize_t)result; 5525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 5535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5545994b4798b01f3dd340577c9ea9657f09093a770Andreas Hubersize_t NuCachedSource2::cachedSize() { 5555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 5565994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return mCacheOffset + mCache->totalSize(); 5575994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 5585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 559a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Hubersize_t NuCachedSource2::approxDataRemaining(status_t *finalStatus) const { 5605994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 5611bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney return approxDataRemaining_l(finalStatus); 5625994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 5635994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 564a53d87c7b1428fe02f535c31dafd64cb1362fde9Andreas Hubersize_t NuCachedSource2::approxDataRemaining_l(status_t *finalStatus) const { 5651bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney *finalStatus = mFinalStatus; 5660683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 5670683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber if (mFinalStatus != OK && mNumRetriesLeft > 0) { 5680683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber // Pretend that everything is fine until we're out of retries. 5690683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber *finalStatus = OK; 5700683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber } 5710683eba6b35c396c21f10e926709f2f8fc05f090Andreas Huber 572c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t lastBytePosCached = mCacheOffset + mCache->totalSize(); 5735994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (mLastAccessPos < lastBytePosCached) { 5745994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return lastBytePosCached - mLastAccessPos; 5755994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 5765994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return 0; 5775994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 5785994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 579c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongssize_t NuCachedSource2::readInternal(off64_t offset, void *data, size_t size) { 580a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber CHECK_LE(size, (size_t)mHighwaterThresholdBytes); 5817bf8413f91fc072452f315a91618aeef2574d420Andreas Huber 582a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("readInternal offset %lld size %zu", offset, size); 5835994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5845994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber Mutex::Autolock autoLock(mLock); 5855994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5867bf8413f91fc072452f315a91618aeef2574d420Andreas Huber if (!mFetching) { 5877bf8413f91fc072452f315a91618aeef2574d420Andreas Huber mLastAccessPos = offset; 5887bf8413f91fc072452f315a91618aeef2574d420Andreas Huber restartPrefetcherIfNecessary_l( 5897bf8413f91fc072452f315a91618aeef2574d420Andreas Huber false, // ignoreLowWaterThreshold 5907bf8413f91fc072452f315a91618aeef2574d420Andreas Huber true); // force 5917bf8413f91fc072452f315a91618aeef2574d420Andreas Huber } 5927bf8413f91fc072452f315a91618aeef2574d420Andreas Huber 5935994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (offset < mCacheOffset 594c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong || offset >= (off64_t)(mCacheOffset + mCache->totalSize())) { 5956ee94582e3ce7bdd9625345e7564e3176a51a2f3James Dong static const off64_t kPadding = 256 * 1024; 5965994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 5975994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber // In the presence of multiple decoded streams, once of them will 5985994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber // trigger this seek request, the other one will request data "nearby" 5995994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber // soon, adjust the seek position so that that subsequent request 6005994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber // does not trigger another seek. 601c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong off64_t seekOffset = (offset > kPadding) ? offset - kPadding : 0; 6025994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6035994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber seekInternal_l(seekOffset); 6045994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 6055994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6065994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t delta = offset - mCacheOffset; 6075994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 60840a4e1440869b2e3981f261b0d301cd16c0cf0aaBryan Mawhinney if (mFinalStatus != OK && mNumRetriesLeft == 0) { 6095994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (delta >= mCache->totalSize()) { 6105994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return mFinalStatus; 6115994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 6125994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6136f5aae1bcba130d5b8092a19fca3627aa565df56Andreas Huber size_t avail = mCache->totalSize() - delta; 61467802977b6f0aa8d6f14f85dadcf32a3cadb9c07Andreas Huber 61567802977b6f0aa8d6f14f85dadcf32a3cadb9c07Andreas Huber if (avail > size) { 61667802977b6f0aa8d6f14f85dadcf32a3cadb9c07Andreas Huber avail = size; 61767802977b6f0aa8d6f14f85dadcf32a3cadb9c07Andreas Huber } 61867802977b6f0aa8d6f14f85dadcf32a3cadb9c07Andreas Huber 6195994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache->copy(delta, data, avail); 6205994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6215994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return avail; 6225994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 6235994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6245994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (offset + size <= mCacheOffset + mCache->totalSize()) { 6255994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCache->copy(delta, data, size); 6265994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6275994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return size; 6285994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 6295994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("deferring read"); 6315994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6325994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return -EAGAIN; 6335994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 6345994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 635c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dongstatus_t NuCachedSource2::seekInternal_l(off64_t offset) { 6365994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mLastAccessPos = offset; 6375994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6385994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber if (offset >= mCacheOffset 639c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong && offset <= (off64_t)(mCacheOffset + mCache->totalSize())) { 6405994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return OK; 6415994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber } 6425994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 643df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("new range: offset= %lld", offset); 6445994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6455994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mCacheOffset = offset; 6465994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6475994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber size_t totalSize = mCache->totalSize(); 6485994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber CHECK_EQ(mCache->releaseFromStart(totalSize), totalSize); 6495994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 65040a4e1440869b2e3981f261b0d301cd16c0cf0aaBryan Mawhinney mNumRetriesLeft = kMaxNumRetries; 6515994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber mFetching = true; 6525994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 6535994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber return OK; 6545994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} 6555994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber 65634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid NuCachedSource2::resumeFetchingIfNecessary() { 65734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber Mutex::Autolock autoLock(mLock); 65834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 65934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber restartPrefetcherIfNecessary_l(true /* ignore low water threshold */); 66034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber} 66134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber 6629d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongsp<DecryptHandle> NuCachedSource2::DrmInitialization(const char* mime) { 6639d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return mSource->DrmInitialization(mime); 664b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 665b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 666b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wangvoid NuCachedSource2::getDrmInfo(sp<DecryptHandle> &handle, DrmManagerClient **client) { 667b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang mSource->getDrmInfo(handle, client); 668b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 669b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 670771b85d9245a24273497792a2515d88d31c99e1eGloria WangString8 NuCachedSource2::getUri() { 671771b85d9245a24273497792a2515d88d31c99e1eGloria Wang return mSource->getUri(); 672771b85d9245a24273497792a2515d88d31c99e1eGloria Wang} 673ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber 6746511c9755c3a3360ba869772600c7aae048a7ffcAndreas HuberString8 NuCachedSource2::getMIMEType() const { 6756511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber return mSource->getMIMEType(); 6766511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber} 6776511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 678a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Hubervoid NuCachedSource2::updateCacheParamsFromSystemProperty() { 679a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber char value[PROPERTY_VALUE_MAX]; 680a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber if (!property_get("media.stagefright.cache-params", value, NULL)) { 681a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber return; 682a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber } 683a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 684a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber updateCacheParamsFromString(value); 685a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber} 686a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 687a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Hubervoid NuCachedSource2::updateCacheParamsFromString(const char *s) { 688a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber ssize_t lowwaterMarkKb, highwaterMarkKb; 6890b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber int keepAliveSecs; 690a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 691db43b34c3428e480f8c4c66e7e88f4001f37f91eMark Salyzyn if (sscanf(s, "%zd/%zd/%d", 6920b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber &lowwaterMarkKb, &highwaterMarkKb, &keepAliveSecs) != 3) { 69329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to parse cache parameters from '%s'.", s); 694a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber return; 695a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber } 696a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 697a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber if (lowwaterMarkKb >= 0) { 698a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mLowwaterThresholdBytes = lowwaterMarkKb * 1024; 699a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber } else { 700a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mLowwaterThresholdBytes = kDefaultLowWaterThreshold; 701a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber } 702a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 703a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber if (highwaterMarkKb >= 0) { 704a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mHighwaterThresholdBytes = highwaterMarkKb * 1024; 705a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber } else { 706a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mHighwaterThresholdBytes = kDefaultHighWaterThreshold; 707a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber } 708a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 7090b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber if (mLowwaterThresholdBytes >= mHighwaterThresholdBytes) { 71029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Illegal low/highwater marks specified, reverting to defaults."); 7110b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber 7120b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber mLowwaterThresholdBytes = kDefaultLowWaterThreshold; 7130b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber mHighwaterThresholdBytes = kDefaultHighWaterThreshold; 7140b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber } 7150b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber 7160b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber if (keepAliveSecs >= 0) { 7170b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber mKeepAliveIntervalUs = keepAliveSecs * 1000000ll; 7180b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber } else { 7190b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber mKeepAliveIntervalUs = kDefaultKeepAliveIntervalUs; 7200b8cd8b0cf1489f8f7c0b2c4d7ea8fea70ca93a1Andreas Huber } 721a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 722a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("lowwater = %zu bytes, highwater = %zu bytes, keepalive = %" PRId64 " us", 723a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mLowwaterThresholdBytes, 724a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mHighwaterThresholdBytes, 725a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber mKeepAliveIntervalUs); 726a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber} 727a045cb0e77097120e86e367e1cab5494ce2a5d5eAndreas Huber 72849c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber// static 72949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Hubervoid NuCachedSource2::RemoveCacheSpecificHeaders( 73049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber KeyedVector<String8, String8> *headers, 73149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber String8 *cacheConfig, 73249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber bool *disconnectAtHighwatermark) { 73349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber *cacheConfig = String8(); 73449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber *disconnectAtHighwatermark = false; 73549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 73649c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber if (headers == NULL) { 73749c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber return; 73849c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber } 73949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 74049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber ssize_t index; 74149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber if ((index = headers->indexOfKey(String8("x-cache-config"))) >= 0) { 74249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber *cacheConfig = headers->valueAt(index); 74349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 74449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber headers->removeItemsAt(index); 74549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 7463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Using special cache config '%s'", cacheConfig->string()); 74749c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber } 74849c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 74949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber if ((index = headers->indexOfKey( 75049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber String8("x-disconnect-at-highwatermark"))) >= 0) { 75149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber *disconnectAtHighwatermark = true; 75249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber headers->removeItemsAt(index); 75349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 7543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Client requested disconnection at highwater mark"); 75549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber } 75649c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber} 75749c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber 7585994b4798b01f3dd340577c9ea9657f09093a770Andreas Huber} // namespace android 759