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