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