HTTPBase.cpp revision dab718bba3945332dc75e268e1e7f0fe2eb91c4a
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 27dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber#include <media/stagefright/foundation/ADebug.h> 285b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong#include <media/stagefright/foundation/ALooper.h> 29dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber 301156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber#include <cutils/properties.h> 31dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber#include <cutils/qtaguid.h> 321156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 331156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubernamespace android { 341156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 355b1b8a93a07326f1cbc627f09e02988375189e0aJames DongHTTPBase::HTTPBase() 365b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong : mNumBandwidthHistoryItems(0), 375b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferTimeUs(0), 385b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferBytes(0), 395b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevBandwidthMeasureTimeUs(0), 405b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevEstimatedBandWidthKbps(0), 419b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mBandWidthCollectFreqMs(5000), 429b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid(false) { 435b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber// static 461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Hubersp<HTTPBase> HTTPBase::Create(uint32_t flags) { 4734fba6695fe1b55710baef561785caa0486654fbAndreas Huber#if CHROMIUM_AVAILABLE 481156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber return new ChromiumHTTPDataSource(flags); 4934fba6695fe1b55710baef561785caa0486654fbAndreas Huber#endif 5034fba6695fe1b55710baef561785caa0486654fbAndreas Huber { 51dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber TRESPASS(); 52dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber 53dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber return NULL; 541156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber } 551156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} 561156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber 575b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid HTTPBase::addBandwidthMeasurement( 585b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong size_t numBytes, int64_t delayUs) { 595b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 605b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 615b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong BandwidthEntry entry; 625b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong entry.mDelayUs = delayUs; 635b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong entry.mNumBytes = numBytes; 645b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferTimeUs += delayUs; 655b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferBytes += numBytes; 665b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 675b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandwidthHistory.push_back(entry); 685b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (++mNumBandwidthHistoryItems > 100) { 695b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong BandwidthEntry *entry = &*mBandwidthHistory.begin(); 705b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferTimeUs -= entry->mDelayUs; 715b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mTotalTransferBytes -= entry->mNumBytes; 725b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandwidthHistory.erase(mBandwidthHistory.begin()); 735b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong --mNumBandwidthHistoryItems; 745b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 755b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong int64_t timeNowUs = ALooper::GetNowUs(); 765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (timeNowUs - mPrevBandwidthMeasureTimeUs >= 775b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandWidthCollectFreqMs * 1000LL) { 785b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 795b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (mPrevBandwidthMeasureTimeUs != 0) { 805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevEstimatedBandWidthKbps = 815b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong (mTotalTransferBytes * 8E3 / mTotalTransferTimeUs); 825b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 835b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mPrevBandwidthMeasureTimeUs = timeNowUs; 845b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 855b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 865b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 875b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 885b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 895b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongbool HTTPBase::estimateBandwidth(int32_t *bandwidth_bps) { 905b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 915b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 925b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (mNumBandwidthHistoryItems < 2) { 935b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return false; 945b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 955b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 965b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong *bandwidth_bps = ((double)mTotalTransferBytes * 8E6 / mTotalTransferTimeUs); 975b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 985b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return true; 995b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 1005b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1015b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t HTTPBase::getEstimatedBandwidthKbps(int32_t *kbps) { 1025b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 1035b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong *kbps = mPrevEstimatedBandWidthKbps; 1045b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return OK; 1055b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 1065b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1075b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t HTTPBase::setBandwidthStatCollectFreq(int32_t freqMs) { 1085b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong Mutex::Autolock autoLock(mLock); 1095b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1105b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong if (freqMs < kMinBandwidthCollectFreqMs 1115b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong || freqMs > kMaxBandwidthCollectFreqMs) { 1125b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1135b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong LOGE("frequency (%d ms) is out of range [1000, 60000]", freqMs); 1145b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return BAD_VALUE; 1155b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong } 1165b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1175b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong LOGI("frequency set to %d ms", freqMs); 1185b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong mBandWidthCollectFreqMs = freqMs; 1195b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong return OK; 1205b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong} 1215b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong 1229b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid HTTPBase::setUID(uid_t uid) { 1239b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 1249b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 1259b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 1269b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1279b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberbool HTTPBase::getUID(uid_t *uid) const { 1289b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber if (!mUIDValid) { 1299b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return false; 1309b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber } 1319b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1329b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber *uid = mUID; 1339b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 1349b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return true; 1359b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 1369b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 137dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber// static 138dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Hubervoid HTTPBase::RegisterSocketUser(int s, uid_t uid) { 139dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber static const uint32_t kTag = 0xdeadbeef; 140dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber set_qtaguid(s, kTag, uid); 141dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber} 142dab718bba3945332dc75e268e1e7f0fe2eb91c4aAndreas Huber 1431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber} // namespace android 144