HTTPBase.cpp revision 9b80c2bdb205bc143104f54d0743b6eedd67b14e
11156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber/* 21156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Copyright (C) 2011 The Android Open Source Project 31156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * 41156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 51156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * you may not use this file except in compliance with the License. 61156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * You may obtain a copy of the License at 71156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * 81156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 91156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * 101156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * Unless required by applicable law or agreed to in writing, software 111156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 121156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * See the License for the specific language governing permissions and 141156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber * limitations under the License. 151156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber */ 161156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 175b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong//#define LOG_NDEBUG 0 185b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong#define LOG_TAG "HTTPBase" 195b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong#include <utils/Log.h> 205b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 211156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "include/HTTPBase.h" 221156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 2334fba6695fe1b55710baef561785caa0486654fbAndreas Huber#if CHROMIUM_AVAILABLE 241156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "include/ChromiumHTTPDataSource.h" 2534fba6695fe1b55710baef561785caa0486654fbAndreas Huber#endif 2634fba6695fe1b55710baef561785caa0486654fbAndreas Huber 271156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include "include/NuHTTPDataSource.h" 281156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 295b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong#include <media/stagefright/foundation/ALooper.h> 301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <cutils/properties.h> 311156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubernamespace android { 331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 345b1b8a93a07326f1cbc627f09e02988375189e0aJames DongHTTPBase::HTTPBase() 355b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong : mNumBandwidthHistoryItems(0), 365b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferTimeUs(0), 375b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferBytes(0), 385b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevBandwidthMeasureTimeUs(0), 395b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevEstimatedBandWidthKbps(0), 409b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mBandWidthCollectFreqMs(5000), 419b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid(false) { 425b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static 451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubersp<HTTPBase> HTTPBase::Create(uint32_t flags) { 4634fba6695fe1b55710baef561785caa0486654fbAndreas Huber#if CHROMIUM_AVAILABLE 471156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber char value[PROPERTY_VALUE_MAX]; 481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber if (!property_get("media.stagefright.use-chromium", value, NULL) 491156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber || (strcasecmp("false", value) && strcmp("0", value))) { 501156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return new ChromiumHTTPDataSource(flags); 5134fba6695fe1b55710baef561785caa0486654fbAndreas Huber } else 5234fba6695fe1b55710baef561785caa0486654fbAndreas Huber#endif 5334fba6695fe1b55710baef561785caa0486654fbAndreas Huber { 541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return new NuHTTPDataSource(flags); 551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 571156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 585b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid HTTPBase::addBandwidthMeasurement( 595b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong size_t numBytes, int64_t delayUs) { 605b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 615b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 625b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong BandwidthEntry entry; 635b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong entry.mDelayUs = delayUs; 645b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong entry.mNumBytes = numBytes; 655b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferTimeUs += delayUs; 665b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferBytes += numBytes; 675b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 685b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandwidthHistory.push_back(entry); 695b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (++mNumBandwidthHistoryItems > 100) { 705b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong BandwidthEntry *entry = &*mBandwidthHistory.begin(); 715b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferTimeUs -= entry->mDelayUs; 725b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferBytes -= entry->mNumBytes; 735b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandwidthHistory.erase(mBandwidthHistory.begin()); 745b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong --mNumBandwidthHistoryItems; 755b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong int64_t timeNowUs = ALooper::GetNowUs(); 775b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (timeNowUs - mPrevBandwidthMeasureTimeUs >= 785b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandWidthCollectFreqMs * 1000LL) { 795b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (mPrevBandwidthMeasureTimeUs != 0) { 815b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevEstimatedBandWidthKbps = 825b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong (mTotalTransferBytes * 8E3 / mTotalTransferTimeUs); 835b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 845b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevBandwidthMeasureTimeUs = timeNowUs; 855b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 865b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 875b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 885b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 895b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 905b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongbool HTTPBase::estimateBandwidth(int32_t *bandwidth_bps) { 915b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 925b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 935b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (mNumBandwidthHistoryItems < 2) { 945b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return false; 955b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 965b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 975b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong *bandwidth_bps = ((double)mTotalTransferBytes * 8E6 / mTotalTransferTimeUs); 985b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 995b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return true; 1005b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 1015b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1025b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t HTTPBase::getEstimatedBandwidthKbps(int32_t *kbps) { 1035b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 1045b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong *kbps = mPrevEstimatedBandWidthKbps; 1055b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return OK; 1065b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 1075b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1085b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t HTTPBase::setBandwidthStatCollectFreq(int32_t freqMs) { 1095b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 1105b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1115b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (freqMs < kMinBandwidthCollectFreqMs 1125b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong || freqMs > kMaxBandwidthCollectFreqMs) { 1135b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1145b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong LOGE("frequency (%d ms) is out of range [1000, 60000]", freqMs); 1155b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return BAD_VALUE; 1165b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 1175b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1185b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong LOGI("frequency set to %d ms", freqMs); 1195b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandWidthCollectFreqMs = freqMs; 1205b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return OK; 1215b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 1225b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1239b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid HTTPBase::setUID(uid_t uid) { 1249b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 1259b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 1269b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 1279b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1289b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberbool HTTPBase::getUID(uid_t *uid) const { 1299b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber if (!mUIDValid) { 1309b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return false; 1319b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber } 1329b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1339b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber *uid = mUID; 1349b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1359b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return true; 1369b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 1379b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1381156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} // namespace android 139