HTTPBase.h revision a93fd2be99d21629bed504b9b7df035fc2f54562
180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License");
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * you may not use this file except in compliance with the License.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * You may obtain a copy of the License at
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *      http://www.apache.org/licenses/LICENSE-2.0
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS,
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * See the License for the specific language governing permissions and
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * limitations under the License.
1558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef HTTP_BASE_H_
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define HTTP_BASE_H_
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <media/stagefright/foundation/ABase.h>
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <media/stagefright/DataSource.h>
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <media/stagefright/MediaErrors.h>
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include <utils/threads.h>
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergernamespace android {
27363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
28d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerstruct HTTPBase : public DataSource {
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum Flags {
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // Don't log any URLs.
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kFlagIncognito = 1
3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    };
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    HTTPBase();
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual status_t connect(
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const char *uri,
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            const KeyedVector<String8, String8> *headers = NULL,
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            off64_t offset = 0) = 0;
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void disconnect() = 0;
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // Returns true if bandwidth could successfully be estimated,
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // false otherwise.
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool estimateBandwidth(int32_t *bandwidth_bps);
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual status_t getEstimatedBandwidthKbps(int32_t *kbps);
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual status_t setBandwidthStatCollectFreq(int32_t freqMs);
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void setBandwidthHistorySize(size_t numHistoryItems);
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static void RegisterSocketUserTag(int sockfd, uid_t uid, uint32_t kTag);
5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static void UnRegisterSocketUserTag(int sockfd);
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static void RegisterSocketUserMark(int sockfd, uid_t uid);
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static void UnRegisterSocketUserMark(int sockfd);
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprotected:
6058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void addBandwidthMeasurement(size_t numBytes, int64_t delayUs);
6158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerprivate:
6358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    struct BandwidthEntry {
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        int64_t mDelayUs;
6558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        size_t mNumBytes;
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    };
6758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    Mutex mLock;
6958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
7058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    List<BandwidthEntry> mBandwidthHistory;
7158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    size_t mNumBandwidthHistoryItems;
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int64_t mTotalTransferTimeUs;
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t mTotalTransferBytes;
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t mMaxBandwidthHistoryItems;
75d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum {
7758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kMinBandwidthCollectFreqMs = 1000,   // 1 second
7858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        kMaxBandwidthCollectFreqMs = 60000,  // one minute
7958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    };
8058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int64_t mPrevBandwidthMeasureTimeUs;
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int32_t mPrevEstimatedBandWidthKbps;
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int32_t mBandWidthCollectFreqMs;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    DISALLOW_EVIL_CONSTRUCTORS(HTTPBase);
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}  // namespace android
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif  // HTTP_BASE_H_
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger